【问题标题】:There is already an open DataReader associated with this Connection which must be closed first VB.NET已经有一个打开的 DataReader 与此 Connection 关联,必须先关闭 VB.NET
【发布时间】:2013-03-05 08:06:15
【问题描述】:

我收到此错误消息

"已经有一个打开的 DataReader 与此 Connection 关联 必须先关闭”

请帮帮我
我的代码是:

Public Sub update_qty(ByVal qry1 As String) 
        Dim dr As MySqlDataReader 'SQLiteDataReader 
        Dim comm As MySqlCommand 'SQLiteCommand 


        Try

            comm = New MySqlCommand(qry1, conn)
            dr = comm.ExecuteReader()
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

        Do While dr.Read()
            exe_query("call cargosys.paymentsAdd('" & var1 & "', " & dr("inNo") & ")")
        Loop

        dr.Close()
End Sub

Public Sub exe_query(ByVal qry As String) As String 

        Dim cmd As MySqlCommand 

        Try
            cmd = New MySqlCommand(qry, conn)
            cmd.ExecuteNonQuery()


        Catch ex As MySqlException
            MessageBox.Show(ex.ToString)      
        End Try

 End Sub

【问题讨论】:

    标签: vb.net


    【解决方案1】:

    您的问题是您的代码打开了DataReader,然后在读取DataReader 时执行SqlCommand

    尝试改变这一行:

     dr = comm.ExecuteReader()
    

    到:

     dr = comm.ExecuteReader(CommandBehavior.CloseConnection)
    

    更多:DataReader CommandBehavior

    或者更改您的连接字符串以启用 MARS(多个活动结果集)。 此设置将允许在同一连接上检索多个只进、只读的结果集。

    例如:

    connectionString=
    "Data Source=.\SQLEXPRESS;
    AttachDbFilename=|DataDirectory|Northwind.MDF;
    Integrated Security=True;
    User Instance=True;
    MultipleActiveResultSets=True"
    

    更多:MARS

    编辑

    由于不支持 MARS 关键字,请尝试将您的代码更改为:

    Public Sub update_qty(ByVal qry1 As String) 
            Dim dr As MySqlDataReader 'SQLiteDataReader 
            Dim comm As MySqlCommand 'SQLiteCommand 
    
    
            Try
    
                comm = New MySqlCommand(qry1, conn)
                dr = comm.ExecuteReader()
            Catch ex As Exception
                MsgBox(ex.Message)
            End Try
    
            Dim myList As New List(Of String)
    
            Do While dr.Read()
                myList.Add("call cargosys.paymentsAdd('" & var1 & "', " & dr("inNo") & ")")
            Loop
    
            dr.Close()
    End Sub
    
    Public Sub exe_query(myList As List(Of String)) 
    
            Dim cmd As MySqlCommand 
    
            For Each query As String In myList
                Try
                    cmd = New MySqlCommand(query, conn)
                    cmd.ExecuteNonQuery()
    
                Catch ex As MySqlException
                    MessageBox.Show(ex.ToString)      
                End Try
            Next
    
     End Sub
    

    而不是同时执行DataReader.Read->SqlCommand.ExecuteNonQuery,此代码将首先读取所有数据,然后运行SqlCommand.ExecuteNonQuery。

    【讨论】:

    • 我用的是Mysql,不支持那个关键字
    • @imsome1 如果此答案解决了您的问题,请通过将其标记为已接受的答案来支持 Iswanto San(按答案旁边的勾号)。
    • “DataReader 已在此命令上处于活动状态”仍然收到此错误。
    猜你喜欢
    • 1970-01-01
    • 2019-01-17
    • 2020-09-25
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 2013-07-18
    相关资源
    最近更新 更多