【发布时间】:2020-02-13 16:58:32
【问题描述】:
我正在从 VB.NET 更新 SQL Server 并不断收到“查询超时错误”,我有很多按顺序运行的子例程,如下所示:
Public Shared Sub Update_DailyRatings()
Dim stallStats As String = ""
Dim win As Integer = 0
Dim mSplit As Array
Dim cn As OleDbConnection = New OleDbConnection(MainForm.connectStringPublic)
cn.Open()
Dim selectString As String = "Select * FROM DailyRatings"
Dim cmd As OleDbCommand = New OleDbCommand(selectString, cn)
Dim reader As OleDbDataReader = cmd.ExecuteReader()
While (reader.Read())
stallStats = Get_Stall_Stats(reader("Track").ToString, CInt(reader("Stall")), CDbl(reader("Distance")))
If stallStats = "" Then
MainForm.NonQuery("UPDATE DailyRatings SET StallWin = 999 WHERE Horse = '" & reader("Horse").ToString & "'")
Else
mSplit = Split(stallStats, ",")
win = mSplit(0)
MainForm.NonQuery("UPDATE DailyRatings SET StallWin = " & win & " WHERE Horse = '" & reader("Horse").ToString & "'")
End If
End While
reader.Close()
cn.Close()
End Sub
NonQuery sub 看起来像这样:
Public Sub NonQuery(ByVal SQL As String)
Dim query As String = SQL
Try
Dim cn3 As OleDbConnection = New OleDbConnection(connectStringPublic)
cn3.Open()
Dim cmd As OleDbCommand = New OleDbCommand(query, cn3)
cmd.CommandTimeout = 90
cmd.ExecuteNonQuery()
cn3.Close()
cn3.Dispose()
cmd.Dispose()
OleDbConnection.ReleaseObjectPool()
Catch e As System.Exception
Clipboard.SetText(query)
MsgBox(e.Message)
Finally
End Try
End Sub
如您所见,我一直在尝试解决这个问题,这是我在其他线程中发现的,例如延长超时时间和使用 Dispose() 和 ReleaseObjectPool() 方法,但它没有奏效,我仍然得到查询超时按顺序运行我的所有潜艇时至少出错一次,它也不总是同一个潜艇。
我最近从 Access 迁移,这在 Access 中从未发生过。
【问题讨论】:
-
您的
OleDbDataReader可能会在 'Read` 方法中锁定您的表,从而导致死锁。 -
我怎样才能阻止这种情况发生?
-
您可以使用
OleDbDataAdapter将数据填充到DataTable中,而不是使用OleDbDataReader,然后遍历行以运行更新。
标签: sql-server vb.net