首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# ADO.NET 交易、批次更新與回滾完整範例

     編輯:關於C語言

使用 SqlDataAdapter 配合 SqlTransaction 實現資料集的批次更新與異常回滾,確保資料一致性。本文提供可直接套用的標準模式程式碼。

核心程式碼

public void UpdateContactTableByDataSet(DataSet ds, string tableName)
{
    using (var conn = new SqlConnection(connectionString))
    using (var adapter = new SqlDataAdapter($"SELECT * FROM {tableName}", conn))
    using (var cmdBuilder = new SqlCommandBuilder(adapter))
    {
        conn.Open();
        using (var tran = conn.BeginTransaction())
        {
            adapter.SelectCommand.Transaction = tran;
            adapter.InsertCommand.Transaction = tran;
            adapter.UpdateCommand.Transaction = tran;
            adapter.DeleteCommand.Transaction = tran;

            try
            {
                adapter.Update(ds, tableName);
                tran.Commit();
            }
            catch (Exception ex)
            {
                try { tran.Rollback(); }
                catch (SqlException rbEx)
                {
                    if (tran.Connection != null)
                        Log.Error($"回滾失敗: {rbEx}");
                }
                throw; // 重新拋出原始異常
            }
        }
    }
}

關鍵點解析

  1. CommandBuilder 自動生成 SQL:SqlCommandBuilder 根據 SelectCommand 自動產生 Insert/Update/DeleteCommand,需查詢包含主鍵。
  2. 所有命令綁定同一交易:四個 Command 必須共用同一 SqlTransaction 實例。
  3. using 區塊確保資源釋放:連線、交易、適配器皆在 using 中自動 Dispose/Close。
  4. 回滾亦需 try-catch:極少數情況 (連線中斷) 回滾會拋出異常,需記錄但不掩蓋原始錯誤。
  5. 重新拋出 throw;:保留完整堆疊追蹤,勿用 throw ex;。

進階:批次大小與效能

SqlDataAdapter.UpdateBatchSize (預設 1) 可啟用批次提交,減少網路往返:

adapter.UpdateBatchSize = 100; // 每 100 筆打包一次

需 SQL Server 2008+ 且命令為參數化 SQL (CommandBuilder 自動產生即符合)。

替代方案:Entity Framework Core

現代專案建議使用 EF Core:

using (var ctx = new MyDbContext())
using (var tran = ctx.Database.BeginTransaction())
{
    try
    {
        ctx.BulkUpdate(entities); // 或 ctx.SaveChanges();
        tran.Commit();
    }
    catch { tran.Rollback(); throw; }
}

EF Core 內建變更追蹤、樂觀並行、交易支援,程式碼更簡潔且型別安全。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved