SqlDataReader内部的SqlDataReader

11

如何在另一个 SqlDataReader 中实现一个 SqlDataReader

我的问题是我有一个 SqlDataReader。我正在发出 while(reader.read()),并且在 while 循环内部我必须创建另一个 SqlDataReader 从数据库中读取。但我得到了关于连接已经打开的异常。

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

编辑:

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

System.InvalidOperationException: 已存在与此命令关联的打开的 DataReader,必须先关闭它。


你是否正在使用与之前的SqlDataReader相同的连接?你尝试过创建一个新的连接吗? - Thanos Papathanasiou
是的,我尝试创建一个新的程序,但问题在于我正在使用CLR,在部署时它可以工作,但当我在应用程序中使用存储过程时会出现异常... - scatman
2个回答

18

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

这在ADO.NET 2.0及以上版本中提供,并且需要在连接字符串中设置一个特定的参数(MultipleActiveResultSets=true;):

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

请参阅这篇博客文章,其中有一次出色的讨论。

有了这个,您应该能够在代码中共享多个SqlDataReader,并独立使用它们。

更新:这篇博客文章提到MARS功能不可在SQL CLR环境中使用 :-( 因此,在SQL CLR存储过程中将无法使用它。


是的,它绝对应该可以(只要他们使用相同的连接,例如一个完全相同的连接字符串 - 相同到最后一个逗号和空格!) - marc_s
当使用clr时,它并没有起作用。在创建存储过程后,我尝试在MS-SQL上测试它,但出现了异常,指出:System.InvalidOperationException:已经有一个与此命令关联的打开的DataReader,必须先关闭它。 - scatman
@scatman:是的,不幸的是,似乎不支持这个功能 - 请看我的更新.....抱歉。 - marc_s

6
您遇到的问题是您正在尝试针对同一数据库连接打开多个数据读取器。默认情况下,这将导致异常,因为它会说已经有一个与连接相关联 - 就像您所看到的那样。
您可以使用 MultipleActiveResultsets,从.NET 2.0和SQL Server 2005开始,您可以在连接字符串中添加一个额外选项来启用针对单个数据库连接的多个活动结果集。
MultipleActiveResultSets=True;

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

或者,甚至可以重新考虑原始方法 - 也许有一种方法可以在没有嵌套读取器的情况下完成它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接