C# 将SqlDataReader作为参数传递

C# 将SqlDataReader作为参数传递,c#,asp.net,C#,Asp.net,我同意以下问题: 我有一个返回SqlDataReader的方法,然后我在这个SqlDataReader中执行了一段时间,如下所示: using (SqlDataReader objSqlDtReader = objDtAccess.GetDataReader()) { while(objSqlDtReader.Read()) { UserEntitie objUserEntitie = new UserEntitie(); objU

我同意以下问题: 我有一个返回SqlDataReader的方法,然后我在这个SqlDataReader中执行了一段时间,如下所示:

using (SqlDataReader objSqlDtReader = objDtAccess.GetDataReader()) 
{
    while(objSqlDtReader.Read()) 
    {
           UserEntitie objUserEntitie = new UserEntitie();
           objUserEntitie.Name = Convert.ToString(objSqlDtReader["name"])    
    }
}
所以,我需要用所有数据、名称、电子邮件、Id填充我的所有UserEntite。但是我在用户类中有许多方法(GetUserById、GetUserByEmai、GetAllUsers),我必须再次填充数据

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


有什么建议吗?

您可以这样做:

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"));
}

我不知道问题出在哪里。你已经决定做什么了。