VB.Net中的嵌套Datareader

时间:2013-03-31 10:18:02

标签: sql-server vb.net datareader

我正在使用.net 4.0 Framework(VB)和SQL Express 2005.我需要在使用datareader嵌套时使用do。有点像.......

SQLQuery1="Select * from Table1"
cmd = New Data.SqlClient.SqlCommand(SQLQuery1, myConn)
If cmd.Connection.State = 1 Then cmd.Connection.Close()
cmd.Connection.Open()
dr = cmd.ExecuteReader
Do While dr.Read
  SQLQuery2="Select * from Table2 where ID=" & dr.item("field1")
  cmd2 = New Data.SqlClient.SqlCommand(SQLQuery2, myConn)
  If cmd2.Connection.State = 1 Then cmd2.Connection.Close()
  cmd2.Connection.Open()
  dr2 = cmd2.ExecuteReader
  Do While dr2.Read
    --------- Execute Insert/Update Statement here ----------------
  loop
  dr2.close
loop
dr.close

它第一次执行但是当它第二次返回“Do While dr.Read”时它会给出错误 读取器关闭时无效尝试调用读取。 我在连接字符串中使用MARS = true但没有看到任何差异。

我做错了什么?

由于

2 个答案:

答案 0 :(得分:0)

来自Microsoft帮助:

在SQL Server 2005之前使用SQL Server版本时,在使用SqlDataReader时,关联的SqlConnection正忙于为SqlDataReader提供服务。在此状态下,除了关闭它之外,不能对SqlConnection执行任何其他操作。在调用SqlDataReader的Close方法之前就是这种情况。从SQL Server 2005开始,多活动结果集(MARS)功能允许使用相同连接的多个操作。

所以,我担心您需要不同的连接来嵌套数据读取器

答案 1 :(得分:-1)

1)两个SqlCommands共享相同的连接

2)从dr

读取时关闭连接

3)当你想循环dr2时你循环dr(参见@ Jack的回答)