在VB.NET中执行多个存储过程

时间:2015-07-27 22:15:05

标签: mysql vb.net stored-procedures

我在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()

问题是这不起作用。它说已经有一个与此Connection相关联的开放DataReader必须先关闭。所以我尝试创建不同的SQL命令,关闭并重新打开连接,并创建不同的连接,如建议的{{但是所有这些都没有成功。 here类似乎很有用,但这是一个简单(?)任务的大量代码。我已经阅读了很多类似的问题,但我还没找到我需要的东西。

我该如何处理这个问题?一些帮助会很好。

1 个答案:

答案 0 :(得分:1)

这看起来像是您链接到的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,然后只需要一个连接(假设数据不是'太大了。)