我在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类似乎很有用,但这是一个简单(?)任务的大量代码。我已经阅读了很多类似的问题,但我还没找到我需要的东西。
我该如何处理这个问题?一些帮助会很好。
答案 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
,然后只需要一个连接(假设数据不是'太大了。)