2012-05-30 5 views
0

я с последующей вопрос: У меня есть метод, который возвращает SqlDataReader, то я некоторое время в этом SqlDataReader, как вы видите ниже:Pass SqlDataReader в качестве параметра

using (SqlDataReader objSqlDtReader = objDtAccess.GetDataReader()) 
{ 
    while(objSqlDtReader.Read()) 
    { 
      UserEntitie objUserEntitie = new UserEntitie(); 
      objUserEntitie.Name = Convert.ToString(objSqlDtReader["name"])  
    } 
} 

Итак, мне нужно заполните все мои UserEntite всеми данными, именем, электронной почтой, идентификатором. Но у меня есть много методов в User Class as (GetUserById, GetUserByEmai, GetAllUsers), и я должен снова заполнить данные.

Мне нужно создать частный метод, который заполнит мой UserEntitie, и в каждом методе я вызываю только свой метод FillUser и возвращаю его. Я думаю, что мне нужно передать мой SqlDataReader в мой частный метод FillUser.

Любые предложения для этого?

+1

Не могу получить, где проблема. Вы уже решили, что делать. – Reniuz

ответ

1

Вы могли бы сделать что-то вроде этого:

class UserEntitie 
{ 
    internal void FillFromSqlDataReader(SqlDataReader reader) 
    { 
     this.Name = Convert.ToString(reader["name"]); 
     /* Fill your fields */ 
    } 
} 

Использование:

using (SqlDataReader objSqlDtReader = objDtAccess.GetDataReader()) 
{ 
    while(objSqlDtReader.Read()) 
    { 
     UserEntitie objUserEntitie = new UserEntitie(); 
     objUserEntitie.FillFromSqlDataReader(objSqlDtReader); 
     /* Add to a list or something */  
    } 
} 
1

Я использую подобного рода системы, но вместо передачи SqlDataReader в частный объект, вместо этого я передать SqlConnection в объект и иметь частный метод FillDetailsFromDb(), который выполняет необходимую работу.

Итак, вместо передачи SqlDataReader у меня будет конструктор без параметров, а также конструктор, который принимает SqlConnection в качестве параметра.

Когда я создал объект, я передам параметр (в моем случае его Guid) в объект, а мой частный метод использует SqlConnection, который был создан вместе со свежей SqlCommand, которая принимает переданный параметр к публичному методу.

private void FillDetailsFromDb(Guid p) 
    { 
     SqlCommand com = new SqlCommand(); 
     com.Connection = conn; 

     com.CommandText = "spSelectProspectUsingLinkParameter"; 
     com.CommandType = CommandType.StoredProcedure; 
     com.Parameters.AddWithValue("@linkparam", p); 
     conn.Open(); 
     SqlDataReader rdr = com.ExecuteReader(); 
     ... 
     etc 
    } 

Это означает, что объект все еще может существовать в виде дискретного объекта и может быть использован в других местах и ​​SqlDataReader не должны быть розданы, который я нашел, что это не очень нравится.

Кстати, пока я сам изучал эту проблему, я обнаружил, что был хороший шанс, что я ударил бы странные нулевые значения при переводе данных из типов данных в базу данных в .Net-типы данных. Используя что-то вроде следующего кода, мне удалось избежать типов данных DBNull, а также использовать имена столбцов в базе данных.

if (!rdr.IsDBNull(rdr.GetOrdinal("firstname"))) 
{ 
    Firstname = rdr.GetString(rdr.GetOrdinal("firstname")); 
} 
Смежные вопросы