有時候程式處理的資料量比較小時,四平八穩,一切安然無恙,但資料量一大,原先潛伏的問題就暴露無遺了。
我做的一個項目,是負責一個廠的考勤的。廠裡有員工1000多号人。按每人每天打4次卡,一個月30天,則産生的考勤記錄數目為1000 * 4 * 30 = 120,000條。在處理這些記錄時,我采用的辦法是先生成SQL語句,然後執行這些SQL語句:
SqlConnection conn = new SqlConnection(strConn);
conn.Open();
SqlTransaction trans = conn.BeginTransaction();
try
{
CEngine.ExecuteNonQuery(trans, CommandType.Text, sql);
trans.Commit();
}
catch(SqlException ex)
{
trans.Rollback();
ErrorCode = ex.Number;
Info = "資料操作失敗:" + ex.Message;
}
finally
{
trans.Dispose();
conn.Close();
}
但運作的時候卻出錯。錯誤提示為“SqlTransaction已經用完;它再也不能使用。”
開始時,我懷疑是跟記憶體有關。因為系統需要做好事務復原的準備,每執行一條插入或修改的SQL,都要有一定的開銷,資料量一大,恐怕就吃不消了。不過我查了一下SQL SERVER的資料,未見提到記憶體的問題。
SqlConnection conn = new SqlConnection(strConn);
conn.Open();
SqlTransaction trans = conn.BeginTransaction();
try
{
SqlCommand cmd = new SqlCommand();
cmd.CommandType = CommandType.Text;
//連接配接時限改為300秒
cmd.CommandTimeout = 300;
cmd.CommandText = sql;
cmd.Connection = conn;
cmd.Transaction = trans;
cmd.ExecuteNonQuery();
trans.Commit();
}
catch(SqlException ex)
{
trans.Rollback();
ErrorCode = ex.Number;
Info = "資料操作失敗:" + ex.Message;
}
finally
{
trans.Dispose();
conn.Close();
}