通SqlDataReader对象为参数

问题描述:

我与后续问题: 我有一个返回一个SqlDataReader的方法,然后我做虽然在这个SqlDataReader的,你看到波纹管:通SqlDataReader对象为参数

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

所以,我需要填写我的所有UserEntite的所有数据,名称,电子邮件,身份证。但是我在用户类中有很多方法(GetUserById,GetUserByEmai,GetAllUsers),我必须再次填充数据。

我需要创建一个私人方法来填充我的UserEntitie,并且在每个方法中我只调用我的方法FillUser并返回它。我认为我需要将我的SqlDataReader传递给我的私有方法FillUser。

任何建议这样做?

+1

无法得到问题出在哪里。你已经决定要做什么。 – Reniuz

你可以做这样的事情:

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 */  
    } 
} 

我使用的是类似类型的系统,而是路过SqlDataReader中到私有对象,而不是我将SqlConnection传递到对象中,并拥有执行必要工作的私有方法FillDetailsFromDb()

因此,我将有一个无参数构造函数以及一个将SqlConnection作为参数的构造函数,而不是传递一个SqlDataReader。

当我创建对象时,我会传递一个参数(在我的情况下它是一个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")); 
}