我正在VB.NET中创建WinService,以从表中获取一些数据,对这些数据进行一些处理,然后将新数据上传到该表中。
我需要的是这样的:

Dim conn As New MySqlConnection(my_connString)
conn.Open()

Dim cmd As New MySqlCommand("my_Stored_Procedure_1", conn)
cmd.CommandType = CommandType.StoredProcedure

Dim reader As MySqlDataReader = cmd.ExecuteReader()

While reader.Read()
    Try
        ' SP to SELECT Data from DB table '
        Dim columnData As String
        columnData = reader("ColumnName")
        columnData_2 = reader("ColumnName_2")

        ' (...) Do something with this Data '

        Try
            ' SP to UPDATE Data into the same DB table '
            'cmd.Dispose() '
            cmd = New MySqlCommand("my_Stored_Procedure_2", conn)
            cmd.CommandType = CommandType.StoredProcedure
            cmd.ExecuteReader()

            ' (...) Do something else '

        Catch ex As Exception
            Console.WriteLine("ERROR: " & ex.Message)
        End Try
    Catch ex As Exception
        Console.WriteLine("ERROR: " & ex.Message)
    End Try
End While

reader.Close()
conn.Close()


问题是这行不通。它说已经有一个与此连接相关联的打开的DataReader,必须先关闭它。因此,我尝试创建不同的SQL命令,关闭并重新打开连接,并创建不同的连接(如建议的here),但所有连接均未成功。 This类似乎很有用,但是对于一个简单的(?)任务来说,有很多代码。我已经读过很多类似的问题,但是还没有找到我需要的东西。

我该如何处理?一些帮助会很好。

最佳答案

这肯定看起来像您链接到的the question的重复,但是那里的答案并未提供有关如何解决该错误的大量详细信息。如错误所述,每个连接只能有一个打开的读取器,因此您需要使用其他连接进行更新。您说您已经尝试过,但是也许您的尝试是不正确的。如链接问题中所建议,您还应该使用Using语句进行资源管理。

因此,您可能想要这样的东西(当然,未经测试!):

Try
    Using conn1 As New MySqlConnection(my_connString),
          conn2 As New MySqlConnection(my_connString)

        conn1.Open()
        conn2.Open()

        Using cmd1 As New MySqlCommand("my_Stored_Procedure_1", conn1)
            cmd1.CommandType = CommandType.StoredProcedure

            Using reader1 As MySqlDataReader = cmd1.ExecuteReader()
                While reader1.Read()
                    ' SP to SELECT Data from DB table '
                    Dim columnData As String
                    columnData = reader1("ColumnName")
                    columnData_2 = reader1("ColumnName_2")

                    ' (...) Do something with this Data '

                    ' SP to UPDATE Data into the same DB table '
                    Using cmd2 As New MySqlCommand("my_Stored_Procedure_2", conn2)
                        cmd2.CommandType = CommandType.StoredProcedure
                        Using reader2 As MySqlDataReader = cmd2.ExecuteReader()
                            ' (...) Do something else '
                        End Using ' reader2
                    End Using ' cmd2
                End While
            End Using ' reader1
        End Using ' cmd1
    End Using ' conn1, conn2
Catch ex As Exception
    Console.WriteLine("ERROR: " & ex.Message)
End Try


从嵌套级别可以看出,在资源范围方面有很多事情要做,因此您可能希望将其重构为多种方法。您也可以使用数据适配器为DataTable的结果填充my_Stored_Procedure_1,而不是使用DataReader,然后只需要一个连接(假设数据对于该连接来说不是太大)。

关于mysql - 在VB.NET中执行多个存储过程,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31664254/

10-11 04:56