将SqlDataReader作为参数传递

时间:2012-05-30 12:16:53

标签: c# asp.net

我有以下问题: 我有一个方法返回一个SqlDataReader,然后我在这个SqlDataReader中做一个While,如下所示:

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

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

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

有任何建议吗?

2 个答案:

答案 0 :(得分: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 :(得分:1)

我正在使用类似的系统,但我没有将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"));
}