7

我在 Microsoft SQL Server 2005 的存储过程中编写了三个 select 语句。两个 select 语句都返回多条记录,并且 select 语句的表列表不同。一个从主表中选择记录,另一个从子表中选择记录。在 C# 代码中,我想获取所有这些记录并将所有数据放在一个对象中。我正在使用 SqlDataReader。有可能还是我应该做其他事情。

4

2 回答 2

18

您可以在数据读取器上使用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 排序,则可以优化最后一个循环以仅从字典中查找每个主控一次。如果结果集很小,那么收益不会那么大。

于 2009-04-12T11:28:16.140 回答
2

...从主表中选择记录,从子表中选择其他记录。在 C# 代码中,我想获取所有这些记录并将所有这些数据放在一个对象中...

Peter 的解决方案旨在解决使用单个DataReader. 但是,如果要将数据保存到复制 Master-Details 表之间关系的对象中,则应该使用 a DataSet

DataSet 可以包含多个s,并通过允许在表之间创建s 来为表DataTable之间的固有关系提供完全支持。然后,您可以分别通过调用或从 Master 或 Details 表DataRelation中获取每个场景的相关记录。GetChildRows()GetParentRows()

网上可能有很多示例说明了如何执行此操作。这是我的小组的一个讨论线程,其中我列出了步骤并提供了一些代码来演示该过程。

于 2009-04-12T12:35:37.427 回答