1

このエラーメッセージが表示されます

「この接続に関連付けられた開いている DataReader が既に存在しますが、これを最初に閉じる必要があります」

私を助けてください
私のコードは次のとおりです。

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
4

1 に答える 1

4

あなたの問題は、コードが a を開いてから、読み取り時にDataReader実行することですSqlCommandDataReader

この行を変更してみてください:

 dr = comm.ExecuteReader()

に:

 dr = comm.ExecuteReader(CommandBehavior.CloseConnection)

詳細: DataReader CommandBehavior

または、接続文字列を変更して MARS (Multiple Active Result Sets) を有効にします。この設定により、同じ接続で複数の転送専用、読み取り専用の結果セットを取得できます。

例えば ​​:

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

于 2013-03-05T08:11:19.020 に答える