如何从具有多个表的 IDataReader 中检索值

Posted

技术标签:

【中文标题】如何从具有多个表的 IDataReader 中检索值【英文标题】:How to retrieve value from IDataReader that have multiple tables 【发布时间】:2017-04-04 08:48:25 【问题描述】:

我最近一直在尝试从IDataReader 获取值,但无法从我查询的第二个表中获取数据。有人可以帮我找到一种方法来获取它们。这是我目前所拥有的:

using (SqlCommand command = new SqlCommand(@"SELECT name, value from Company.dbo.A;SELECT sum(value) from Company.dbo.A  ", connection))

    command.Notification = null;

    SqlDependency dependency = new SqlDependency(command);
    dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);

    if (connection.State == ConnectionState.Closed)
        connection.Open();

    using (var reader = command.ExecuteReader())
         return reader.Cast<IDataRecord>()
                      .Select(x => new LocationInfo()
                        
                            Names = x.GetString(0),
                            Values = Math.Round(x.GetDouble(1), 2).ToString("#,##0.00"),
                            ValuesDouble=x.GetDouble(1),
                            SumVol=x.GetDouble(2)//this line does not work(index out of bounds error)

                      ).ToList();

因此,您如何获得第二个 SQL 命令,即 SUM(value) into SumVol,我已为其创建了 public double SumVol get; set;

【问题讨论】:

【参考方案1】:

您需要调用reader.NextResult() 让阅读器输出第二个结果集。您可能需要分两遍执行此操作,或者重新构建查询以在单个结果集中执行此操作。

这是一个查询,可以为您提供每个唯一名称的总和

SELECT name, value, SUM(value) OVER (PARTITION BY name) from Company.dbo.A;

这是一个使用子查询来获取要在每一行上打印的总和

SELECT name, value, (SELECT sum(value) from Company.dbo.A) from Company.dbo.A;

【讨论】:

感谢您的回答,但是有没有办法从两个 sqlcommand 中获取值?因为我的查询比这复杂得多。提前谢谢你 我在第一段中告诉过你,使用reader.NextResult() 切换到第二个结果集,然后在返回结果之前更新列表的值。 我还是不明白如何使用 reader.NextResult()。我必须使用(阅读器)制作 2 吗?,我将 reader.NextResult() 放在哪里?很抱歉问得太多了,但你能给我在上面的上下文中使用 reader.NextResult() 的例子吗?谢谢你的关注顺便说一句:)

以上是关于如何从具有多个表的 IDataReader 中检索值的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:通过另一个表从具有关联表的表中检索记录

在具有多个表的 sqlite 数据库中检索链接对象列表的查询是啥?

如何检索表的值以获取sql中两列的最大值

C#中IDataReader和DataSet的区别是啥呢?

如何从特定数据库中检索具有行数的表名?

sql 数据库中具有多个表的活动崩溃 - Android Studio