在資料庫操作中,交易機制是確保資料一致性的關鍵。當需要一次執行多個 SQL 指令,且必須全部成功或全部失敗時,交易處理便顯得不可或缺。本文將透過實際程式碼示範,在 C# 中如何使用 SqlTransaction 實現批量更新、提交與回滾。
以下範例展示如何利用 SqlDataAdapter 搭配 SqlCommandBuilder 對 DataSet 進行批量更新,並包裹在交易中:
public void UpdateContactTableByDataSet(DataSet ds, string strTblName)
{
try
{
SqlDataAdapter myAdapter = new SqlDataAdapter();
SqlConnection conn = new SqlConnection(strConnection);
SqlCommand myCommand = new SqlCommand("select * from " + strTblName, conn);
myAdapter.SelectCommand = myCommand;
SqlCommandBuilder myCommandBuilder = new SqlCommandBuilder(myAdapter);
conn.Open();
SqlTransaction myTrans = conn.BeginTransaction();
myCommand.Transaction = myTrans;
try
{
myAdapter.Update(ds, strTblName);
myTrans.Commit();
}
catch (Exception e)
{
try
{
myTrans.Rollback();
}
catch (SqlException ex)
{
if (myTrans.Connection != null)
{
Console.WriteLine("回滾失敗! 異常類型: " + ex.GetType());
}
}
}
finally
{
conn.Close();
}
}
catch (Exception ex)
{
throw ex;
}
}
SqlConnection 和 SqlCommand 設定查詢指令。conn.BeginTransaction() 開啟交易,並將命令的 Transaction 屬性指向該交易物件。myAdapter.Update(ds, strTblName) 會根據 DataSet 的變更自動產生 INSERT/UPDATE/DELETE 指令(由 SqlCommandBuilder 產生)。Commit(),發生例外則呼叫 Rollback() 復原所有變更。finally 區塊確保連線關閉,避免連線洩漏。using 區塊自動管理 SqlConnection、SqlTransaction 等實作 IDisposable 的物件。SqlException),避免吞沒錯誤資訊。BatchSize 或改用 SqlBulkCopy 以提升效能。掌握交易處理能有效保障資料完整性。實務上應結合錯誤記錄、重試機制與效能監控,構建健壯的資料存取層。