为什么我不能在一个程序中使用两个datareader?

时间:2009-11-23 09:10:45

标签: ado.net sqldatareader

你能解释一下为什么我不能在程序中使用两个datareader吗?

以下是示例代码:

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时。有用。

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

3 个答案:

答案 0 :(得分:4)

这是因为你实际上是在共享同一个连接。

您需要:
1)为每个SqlCommand使用不同的连接,这是您以前执行此操作的原始方式

2)使用MARS(多个活动结果集),如here

所述

答案 1 :(得分:1)

我之前没有尝试过,但它应该是可能的。

阅读Using Multiple Active Result Sets和,
MSDN上的Enabling Multiple Active Result Sets

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

摘自其中一篇文章:

  

访问多个结果集   以前版本的SQL Server使用   SqlDataReader对象,单独的   必须使用SqlConnection对象   每个SqlCommand对象。

答案 2 :(得分:1)

This文章解释了问题所在,并介绍了如果使用SQL Server的解决方案。该解决方案称为MARS或多个活动记录集,可在SQL Server 2005及更高版本中使用。