有時候程序處理的數據量比較小時,四平八穩,一切安然無恙,但數據量一大,原先潛伏的問題就暴露無遺了。
原訪問數據庫的代碼為:
1SqlConnection conn = new SqlConnection(strConn);
2conn.Open();
3SqlTransaction trans = conn.BeginTransaction();
4try
5{
6 CEngine.ExecuteNonQuery(trans,CommandType.Text,sql);
7 trans.Commit();
8}
9catch(SqlException ex)
10{
11 trans.Rollback();
12 ErrorCode = ex.Number;
13 Info = "數據操作失敗:" ex.Message;
14}
15finally
16{
17 trans.Dispose();
18 conn.Close();
19}
20
21
22
運行時,一旦出現數據量過大或者處理時間較長,則系統會提示出錯。錯誤提示為“SqlTransaction已經用完;它再也不能使用。”
開始時,我懷疑是跟內存有關。因為系統需要做好事務回滾的准備,每執行一條插入或修改的SQL,都要有一定的開銷,數據量一大,恐怕就吃不消了。不過我查了一下SQL SERVER的資料,未見提到內存的問題。
後來想到,數據庫連接SqlTransaction有個時間問題。默認是15秒。數據量大的時候,這個時間很可能就不夠了。於是改為:
1SqlConnection conn = new SqlConnection(strConn);
2conn.Open();
3SqlTransaction trans = conn.BeginTransaction();
4try
5{
6 SqlCommand cmd = new SqlCommand();
7 cmd.CommandType = CommandType.Text;
8 //連接時限改為300秒
9 cmd.CommandTimeout = 300;
10 cmd.CommandText = sql;
11 cmd.Connection = conn;
12 cmd.Transaction = trans;
13 cmd.ExecuteNonQuery();
14 trans.Commit();
15}
16catch(SqlException ex)
17{
18 trans.Rollback();
19 ErrorCode = ex.Number;
20 Info = "數據操作失敗:" ex.Message;
21}
22finally
23{
24 trans.Dispose();
25 conn.Close();
26}
修改後在測試,問題解決:)