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

ADO.NET 2.0 批量更新:UpdateBatchSize 提升大量資料寫入效能

     編輯:更多程式設計知識

背景與動機

在 ADO.NET 1.x 時代,SqlDataAdapter.Update 會針對 DataSet 中每一筆異動逐一發送 SQL 指令,造成大量往返。ADO.NET 2.0 引入 UpdateBatchSize 屬性,允許將多條 INSERT/UPDATE/DELETE 打包在單一網路封包中送出,大幅降低 Round-trip 成本。

關鍵屬性

屬性預設值說明
UpdateBatchSize1每批次處理的資料列數;設為 >1 啟用批次更新,設為 0 由提供者自動決定最佳批次大小。

完整範例程式

public partial class BatchUpdateForm : Form {
    private SqlConnection conn;
    private SqlDataAdapter dAdapt;
    private DataSet dSet = new DataSet();
    private StringBuilder logString = new StringBuilder();

    public BatchUpdateForm() {
        InitializeComponent();
        conn = new SqlConnection(ConfigurationManager.ConnectionStrings["AWConnectionString"].ConnectionString);
        dAdapt = new SqlDataAdapter("SELECT ProductID, Name, ListPrice FROM Production.Product", conn);
        
        // 註冊事件以觀察批次行為
        dAdapt.RowUpdating += OnRowUpdating;
        dAdapt.RowUpdated  += OnRowUpdated;
    }

    private void getDataButton_Click(object sender, EventArgs e) {
        dAdapt.Fill(dSet, "Product");
        productGrid.DataSource = dSet.Tables["Product"];
    }

    private void updateDataButton_Click(object sender, EventArgs e) {
        SqlCommandBuilder cb = new SqlCommandBuilder(dAdapt);
        logString.Clear();
        
        // 關鍵:設定批次大小(此處從 TextBox 取得)
        dAdapt.UpdateBatchSize = int.Parse(batchSizeTextBox.Text);
        
        dAdapt.Update(dSet.Tables["Product"]);
        MessageBox.Show(logString.ToString());
    }

    void OnRowUpdating(object sender, SqlRowUpdatingEventArgs e) {
        logString.AppendLine("Starting row update");
    }
    void OnRowUpdated(object sender, SqlRowUpdatedEventArgs e) {
        logString.AppendLine("Completed row update");
    }
}

效能比較與注意事項

  • 批次大小建議:100~1000 視網路延遲與記憶體而定;過大可能導致記憶體壓力或逾時。
  • 衝突處理:批次模式下 RowUpdated 事件的 e.Status 需檢查 UpdateStatus.ErrorsOccurred,並透過 e.Row.RowError 逐筆處理。
  • 觸發器影響:資料表若有 AFTER 觸發器,批次更新可能導致觸發器邏輯與單筆模式不同,需測試驗證。
  • 相容性:需 SQL Server 2000 以上版本;Oracle、MySQL 等提供者亦有對應屬性(如 OracleDataAdapter.UpdateBatchSize)。

最佳實務

  1. 先以 UpdateBatchSize = 1 驗證邏輯正確,再調大批次。
  2. 搭配 SqlCommandBuilder 自動產生指令,或手工指定 InsertCommand/UpdateCommand/DeleteCommand 以獲得最佳效能。
  3. 大量匯入場景可考慮 SqlBulkCopy,效能優於批次更新。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved