【问题标题】:Nested Datareader in VB.NetVB.Net 中的嵌套数据读取器
【发布时间】:2013-03-31 10:18:01
【问题描述】:

我正在使用带有 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”时,它给出了错误 阅读器关闭时调用 Read 的尝试无效。 我在连接字符串中使用 MARS=true 但没有发现任何区别。

我哪里做错了?

谢谢

【问题讨论】:

  • 这是一种糟糕的 SQL 执行方式,您应该从一个查询返回 2 个结果集,然后在单个读取器中处理这些结果集。 SQL 在基于集合的操作方面比大量的小查询要好得多。

标签: sql-server vb.net datareader


【解决方案1】:

来自微软的帮助:

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

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

【讨论】:

    【解决方案2】:

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

    2) 在读取 dr 时关闭连接

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

    【讨论】:

    • 1/ 那么 2/ 我在代码中没有看到 3/ 我在外循环中看到 dr,在内循环中看到 dr2
    猜你喜欢
    • 2018-07-03
    • 1970-01-01
    • 2018-05-02
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多