0

我有以下问题:我有一个返回 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。

有什么建议吗?

4

2 回答 2

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 */    
    }
}
于 2012-05-30T12:25:50.953 回答
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"));
}
于 2012-05-30T12:32:43.010 回答