0

你能解释一下为什么我不能在程序中使用两个数据读取器吗?

这是示例代码:

Private Sub  Do_Execute()

  Dim conx as SqlConnection
  Dim cmd1 as SqlCommand
  Dim cmd2 as SqlCommand

  Dim drd1 as SqlDataReader
  Dim drd2 as SqlDataReader

  conx = new SqlConnection("connection string")
  conx.Open()

     cmd1 = new SqlCommand("SELECT * FROM Category" , conx)
     drd1 = cmd1.ExecuteReader()

     While (drd1.Read())
     {
        Reading Data From drd1
     }

     cmd2 = new SqlCommand("SELECT * FROM Stock" , conx)
     drd2 = cmd2.ExecuteReader()

     While (drd2.Read())
     {
        Reading Data From drd2
     }

End Sub

当我执行该程序时,它会抛出异常消息:“已经有一个打开的 DataReader 与此命令关联,必须先关闭!”

当我在初始化 drd2 之前关闭 drd1 时。有用。

为什么我不能像上面的代码一样使用?请解释一下。提前致谢!

4

3 回答 3

4

这是因为您实际上共享相同的连接。

您需要:
1) 为每个 SqlCommand 使用不同的连接,这是您过去必须这样做的原始方式

或者

2)使用 MARS(多个活动结果集),如此处所述

于 2009-11-23T09:18:33.060 回答
1

我以前没有尝试过,但应该可以。

阅读使用多个活动结果集,并在 MSDN 上
启用多个活动结果集

请注意,这是针对 SQL2005 及更高版本的。

摘自其中一篇文章:

要使用 SqlDataReader 对象访问早期版本的 SQL Server 上的多个结果集,必须将单独的 SqlConnection 对象与每个 SqlCommand 对象一起使用。

于 2009-11-23T09:16:55.840 回答
1

本文解释了问题所在,并介绍了使用 SQL Server 时的解决方案。该解决方案称为 MARS,即多活动记录集,可用于 SQL Server 2005 和更高版本。

于 2009-11-23T09:17:03.180 回答