SqlDataReader里面的SqlDataReader

sca*_*man 11 c# sql-server sqldatareader

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

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

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

编辑:

我正在使用clr来创建我的存储过程.我试图MultipleActiveResultSets=true;在clr和项目的连接字符串中放置,并且当我在SQL Server上测试我的存储过程时发生异常:

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

mar*_*c_s 18

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

这是从ADO.NET 2.0开始提供的,并且MultipleActiveResultSets=true;在连接字符串中需要特定的设置():

Server=.\SQLEXPRESS;Database=master;Integrated Security=SSPI;
  MultipleActiveResultSets=true;
Run Code Online (Sandbox Code Playgroud)

请参阅此博客文章,以获得精彩的讨论.

完成后,您应该可以在代码中SqlDataReader共享多个共享SqlConnection,并且可以彼此独立地使用它们.

更新:这篇博客文章提到在SQL CLR环境中没有MARS功能:-(因此在SQL CLR存储过程中不起作用....


Ada*_*Dev 5

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

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

MultipleActiveResultSets=True;
Run Code Online (Sandbox Code Playgroud)

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

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