我正在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/