将 SqlDataReader 作为参数传递
本文关键字:参数传递 SqlDataReader | 更新日期: 2023-09-27 18:35:40
我有以下问题:我有一个返回 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"));
}