如果我在存储过程中有多个select语句,如何使用SqlDataReader

Mad*_*hik 7 stored-procedures sqldatareader multiple-select

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

Pet*_*old 17

您可以 datareader上使用NextResult方法来导航查询中的多个结果.

要遍历所有数据,您可以执行以下操作:

var moreResults = true;
while (moreResults)
{
    while (reader.Read())
    {
    ...
    }
    moreResults = reader.NextResult();
}
Run Code Online (Sandbox Code Playgroud)

因此,以此为背景,假设主结果集首先出现,可以像这样填充主对象和详细对象:

首先,建立一个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, ....});
}
Run Code Online (Sandbox Code Playgroud)

接下来,转到详细记录并将其添加到相应的主记录中:

reader.NextResult();

var masterIdOrdinal = reader.GetOrdinal("masterId");
while (reader.Read())
{
    var masterId = reader.GetInt32(masterIdOrdinal);

    var master = masters[masterId];
    master.Details.Add(new Detail{....});
}
Run Code Online (Sandbox Code Playgroud)

显然,您应该用数据中的内容替换列名,并提供Master和Detail对象的完整初始化.如果详细结果集按主标识排序,则可以优化最后一个循环,以便仅从字典中查找每个主标记一次.如果结果集很小,则增益不会那么大.