【发布时间】:2020-06-12 20:48:28
【问题描述】:
我有一个场景来查询数据库的两列并将所有行返回到不同的方法以进行进一步处理。我不确定我下面的方法是否是最好的。您能否分享任何更好的技术来实现这一点。 以下代码适用于从 SQL 返回的单行。
public (Int32 SiteID, string SiteName) QueryDB(string ConnStr)
{
Int32 SiteID = 0;
string SiteName = "";
using (SqlConnection con = new SqlConnection(ConnStr))
{
SqlCommand cmd = new SqlCommand("spGetSiteDetails", con);
con.Open();
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
SiteID = Convert.ToInt32(reader[0]);
SiteName = reader[1].ToString();
}
}
return (SiteID, SiteName);
}
为了解决多行结果,我使用了在列表中连接的字符串。我相信必须有更好的方法来做到这一点,因为我不得不拆分列表中的字符串以使用这些值。
public List<string> QueryDB(string ConnStr)
{
List<string> SiteDetails = new List<string>();
using (SqlConnection con = new SqlConnection(ConnStr))
{
SqlCommand cmd = new SqlCommand("spGetSiteDetails", con);
con.Open();
SqlDataReader reader = cmd.ExecuteReader();
while (reader.Read())
{
SiteDetails.Add(reader[0] + "|" + reader[1]);
}
}
return SiteDetails;
}
【问题讨论】:
-
所有 ADO.NET 教程都展示了更好的方法。对于初学者,您可以将所有数据加载到 DataTable 中。或者您可以创建强类型对象并将它们的属性设置为列值。或者,您可以创建一个
List<object>并向其添加列值,而不是附加字符串。使用 ORM 将行自动转换为对象,或者使用像 Dapper 这样的 microORM 对单行执行相同的操作。 -
如果
reader[0]或reader[1]是唯一的,您可以将其存储为字典 -
或者你可以使用
reader.GetValues()在一次操作中用所有值填充数组 -
是否有任何理由不使用具有属性
SiteId and SiteName的类而不是两个单独的变量?