我的應用程序需要用戶登錄並允許他們編輯事物列表。但是,似乎如果同一用戶總是登出並編輯列表,則此用戶將遇到「System.Data.SqlClient.SqlException:Timeout過期」。錯誤。我讀過關於它可能由未提交的交易引起的評論。我有一個應用程序。SQL Server中可能的連接泄漏導致「System.Data.SqlClient.SqlException:超時過期」錯誤?
我將提供我正在使用的代碼,並且在那裏有一個IF語句,我有點擔心,但這似乎是一個合理的事情。
我只是想了解一下這裏發生了什麼,還有一個要更新或添加到數據庫中的對象列表。在應用程序中創建的新對象的ID爲0,而現有對象具有從DB生成的其自己的ID。如果用戶選擇刪除某些對象,則其ID將存儲在一個單獨的整數列表中。一旦用戶準備好保存更改,這兩個列表就會被傳遞到這個方法中。通過使用IF語句,添加ID爲0的對象(使用添加存儲過程),並更新具有非零ID的對象(使用更新存儲過程)。畢竟,FOR循環遍歷「刪除」列表中的所有整數,並使用刪除存儲過程刪除它們。所有這些都使用交易。
Public Shared Sub UpdateSomethings(ByVal SomethingList As List(Of Something), ByVal RemovalList As List(Of Integer))
Using DBConnection As New SqlConnection(conn)
DBConnection.Open()
Dim MyTransaction As SqlTransaction
MyTransaction = DBConnection.BeginTransaction()
Try
Using MyCommand As New SqlCommand()
MyCommand.Transaction = MyTransaction
MyCommand.CommandType = CommandType.StoredProcedure
For Each SomethingItem As Something In SomethingList
MyCommand.Connection = DBConnection
If SomethingItem.ID > 0 Then
MyCommand.CommandText = "UpdateSomething"
Else
MyCommand.CommandText = "AddSomething"
End If
MyCommand.Parameters.Clear()
With MyCommand.Parameters
If MyCommand.CommandText = "UpdateSomething" Then
.Add("@id", SqlDbType.Int).Value = SomethingItem.ID
End If
.Add("@stuff", SqlDbType.Varchar).Value = SomethingItem.Stuff
End With
MyCommand.ExecuteNonQuery()
Next
MyCommand.CommandText = "DeleteSomething"
For Each ID As Integer In RemovalList
MyCommand.Parameters.Clear()
With MyCommand.Parameters
.Add("@id", SqlDbType.Int).Value = ID
End With
MyCommand.ExecuteNonQuery()
Next
End Using
MyTransaction.Commit()
Catch ex As Exception
MyTransaction.Rollback()
'Exception handling goes here '
End Try
End Using
End Sub
這裏使用了三個存儲過程以及一些循環,所以我可以看到如果列表足夠大,如何將所有東西都保存起來。
我正在使用Visual Studio 2008進行調試,並且正在爲數據庫使用SQL Server 2000。
編輯:我似乎仍然得到這個錯誤。我甚至刪除了整個交易的事情,我仍然遇到它。此時,我假設這裏發生了某種泄漏。我試過不使用USING語句,並明確告訴命令和連接要自己處理,但沒有骰子。如果在短時間內調用這種方法,SQL Server的內存使用量也會增加很多。
我讀過增加SQLCommand的CommandTimeout屬性會有所幫助。我想知道這樣做是否有任何重大缺點或後果。
順便說一句,我認爲你應該在catch子句中回滾後添加'Rethrow'。你實際上沒有處理異常,所以你應該允許它傳播。 – 2010-05-10 18:32:14
我必須意外刪除了我發佈的示例中的異常處理,但感謝您指出。 :) – Michael 2010-05-10 19:10:53