11

如何SqlDataReader在另一个内部实现SqlDataReader

我的问题是我有一个SqlDataReader. 我正在发出while (reader.read())并在 while 循环内我必须创建另一个SqlDataReader以从数据库中读取。但是我收到了关于连接已经打开的例外情况。

那么解决我的问题的最佳方法是什么?

编辑:

我正在使用 clr 创建我的存储过程。我尝试将MultipleActiveResultSets=true;clr 和项目的连接字符串放入,当我在 SQL Server 上测试我的存储过程时出现异常:

System.InvalidOperationException:已经有一个打开的 DataReader 与此命令关联,必须先关闭。

4

2 回答 2

18

您需要有两个嵌套数据读取器,这需要 ADO.NET“MARS”功能 - 多个活动结果集。

MultipleActiveResultSets=true;这从 ADO.NET 2.0 开始可用,并且需要在连接字符串中进行特定设置 ( ):

Server=.\SQLEXPRESS;Database=master;Integrated Security=SSPI;
  MultipleActiveResultSets=true;

有关精彩讨论,请参阅此博客文章

一旦你有了这个,你应该能够在你的代码中SqlDataReader共享多个SqlConnection,并且彼此独立地使用它们。

更新:这里的这篇文提到,MARS 功能在 SQL CLR 环境中不可用 :-( 所以这在 SQL CLR 存储过程中不起作用......

于 2010-03-01T12:50:12.057 回答
6

您遇到的问题是您试图针对同一个数据库连接打开多个数据读取器。默认情况下,这会给你一个例外,因为它会说已经有一个与连接相关联 - 正如你所看到的。

您可以使用MultipleActiveResultsets,从 .NET 2.0 和 SQL Server 2005 开始,您可以在连接字符串中指定一个额外选项,通过添加以下内容来启用针对单个数据库连接的多个活动结果集:

MultipleActiveResultSets=True;

另一种方法是使用不同的连接来打开内部数据读取器。

甚至,有可能重新考虑你原来的方法——也许有一种方法可以在没有嵌套阅读器的情况下做到这一点。

于 2010-03-01T12:51:50.263 回答