我在 Microsoft SQL Server 2005 的存储过程中编写了三个 select 语句。两个 select 语句都返回多条记录,并且 select 语句的表列表不同。一个从主表中选择记录,另一个从子表中选择记录。在 C# 代码中,我想获取所有这些记录并将所有数据放在一个对象中。我正在使用 SqlDataReader。有可能还是我应该做其他事情。
2 回答
您可以在数据读取器上使用NextResult方法来浏览来自查询的多个结果。
要遍历所有数据,您可以执行以下操作:
var moreResults = true;
while (moreResults)
{
while (reader.Read())
{
...
}
moreResults = reader.NextResult();
}
因此,以此为背景,并假设主结果集首先出现,填充主对象和细节对象可以像这样完成:
首先,建立一个 Master 记录的字典:
var masters = new Dictionary<int, Master>();
var idOrdinal = reader.GetOrdinal("id");
while (reader.Read())
{
var id = reader.GetInt32(idOrdinal);
masters.Add(id, new Master{Id=id, ....});
}
接下来,继续详细记录并将其添加到相应的主记录中:
reader.NextResult();
var masterIdOrdinal = reader.GetOrdinal("masterId");
while (reader.Read())
{
var masterId = reader.GetInt32(masterIdOrdinal);
var master = masters[masterId];
master.Details.Add(new Detail{....});
}
您显然应该用数据中的内容替换列名,并提供 Master 和 Detail 对象的完整初始化。如果详细结果集按主 ID 排序,则可以优化最后一个循环以仅从字典中查找每个主控一次。如果结果集很小,那么收益不会那么大。
...从主表中选择记录,从子表中选择其他记录。在 C# 代码中,我想获取所有这些记录并将所有这些数据放在一个对象中...
Peter 的解决方案旨在解决使用单个DataReader
. 但是,如果要将数据保存到复制 Master-Details 表之间关系的对象中,则应该使用 a DataSet
。
DataSet 可以包含多个s,并通过允许在表之间创建s 来为表DataTable
之间的固有关系提供完全支持。然后,您可以分别通过调用或从 Master 或 Details 表DataRelation
中获取每个场景的相关记录。GetChildRows()
GetParentRows()
网上可能有很多示例说明了如何执行此操作。这是我的小组的一个讨论线程,其中我列出了步骤并提供了一些代码来演示该过程。