1

我正在使用带有 SQL Express 2005 的 .net 4.0 Framework (VB)。我需要在使用 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”时,它给出错误 Invalid attempt to call Read when reader is closed。 我在连接字符串中使用 MARS=true 但没有看到任何区别。

我在哪里做错了?

谢谢

4

2 回答 2

0

来自微软的帮助:

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

所以,恐怕你需要不同的连接来嵌套数据阅读器

于 2018-03-12T18:41:10.713 回答
-1

1)两个SqlCommands共享同一个连接

2)您在阅读博士时关闭连接

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

于 2013-03-31T10:30:14.520 回答