2013-02-21 54 views
1

即時通訊使用asp.net企業庫插入和更新數據到sql數據庫。asp.net企業庫,所有正在使用的連接(關閉)

C#代碼:

Database db = DatabaseFactory.CreateDatabase(); 
IDbConnection connection = db.GetConnection(); 
connection.Open(); 
IDbTransaction transaction = connection.BeginTransaction(); 
DBCommandWrapper command; 

try 
{ 
//insert part 
command = db.GetStoredProcCommandWrapper("stored_procedure1"); 
command.CommandTimeout = 900; 
command.AddInParameter("@parameter1", DbType.Int32, 3); 
db.ExecuteNonQuery(command, transaction); 

//update part 
command = db.GetStoredProcCommandWrapper("stored_procedure2"); 
command.CommandTimeout = 900; 
command.AddInParameter("@param1", DbType.Int32, 5); 
db.ExecuteNonQuery(command, transaction); 

transaction.Commit(); 
} 
catch (SqlException e) 
{ 
    transaction.Rollback(); 
    throw (new ApplicationException("sql error", e)); 
} 
catch (Exception e) 
{ 
    transaction.Rollback(); 
    throw (new ApplicationException("error", e)); 
} 
finally 
{ 
connection.Close(); 
} 

代碼上的方法。 該方法執行很多次,有時會出現以下錯誤: 「Timeout expired。超時時間在從池中獲取連接之前已過去,可能是因爲所有池連接都在使用中並且已達到最大池大小。

我的問題是:是否可以將插入和更新部分放在一起,因爲它在上面?

將插入和更新部分放在一起導致此錯誤?

謝謝。

回答

3

首先,您不會錯誤地回退您的交易。

其次爲了保證你的finally塊被調用,你需要添加catch塊。

Try { 
... 
} 
Catch { 
} 
finally { 
close connection 
} 

閱讀下方

http://msdn.microsoft.com/en-us/library/zwc8s4fz(v=vs.100).aspx

+0

執行另一臺機器上的應用程序時,我得到的錯誤鏈接的第二段。 如何在本地重現錯誤? 我在Visual Studio 2008上有應用程序解決方案和即時調試。 我的意思是,限制池大小將幫助我在本地獲取錯誤? – pyram 2013-02-21 14:46:03

+1

爲了嘗試並重現錯誤消息,您可以在應用程序上創建一個負載測試,以模擬多個用戶點擊該網站。應用程序日誌中是否有任何錯誤消息。檢查那些。 – Victor 2013-02-21 17:38:19

+0

沒有多個用戶。那不是這種情況。在出現錯誤的機器上,只有一個用戶正在使用該應用程序。用戶點擊表單上的一個按鈕,每次點擊該按鈕時,它都會「調用」包含上述代碼的方法。用戶不斷點擊按鈕,直到出現錯誤。所以,它就像是從池中取出所有連接,直到沒有任何東西離開...........現在我無法訪問應用程序日誌,因爲我沒有訪問機器。 – pyram 2013-02-21 19:57:23