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

ADO.NET 中 SqlDataAdapter 更新自增主鍵值不同步問題解決

     編輯:程式設計綜合問答

問題現象

使用 SqlDataAdapter 填充 DataTable 後,刪除表中最後一筆資料並新增一筆,資料庫自增主鍵(ID)比 DataTable 內對應欄位大 1。導致以 DataTable 的 ID 作為刪除條件時失效。

根本原因

  • SqlDataAdapter 預設不會在 Insert 後自動回寫資料庫生成的自增值(Identity)到 DataTable。
  • DataTable 仍保留舊的暫時 ID(如 0 或遞增的本地值),與資料庫實際 ID 不一致。

解決方案

方法一:使用 `UpdatedRowSource` 與 `SelectCommand` 重新查詢

adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.Both; // 需配合 OUTPUT INSERTED.ID
// 或在 Insert 後手動執行 SELECT SCOPE_IDENTITY() 回填

方法二:呼叫 `AcceptChanges` 前先 `Fill` 同步

adapter.Update(dataTable);
dataTable.Clear();
adapter.Fill(dataTable); // 重新從資料庫載入最新身份值

方法三:使用 `SqlCommandBuilder` 自動生成命令並設置 `RefreshSchema`

SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
builder.RefreshSchema(); // 確保結構同步

最佳實踐

  • 資料庫端設置 `IDENTITY(1,1)` 並配合 `OUTPUT INSERTED.ID` 子句(SQL Server 2005+)。
  • 在 RowUpdated 事件中獲取新 ID 並回寫 DataRow。
  • 避免在邏輯中直接依賴 DataTable 的自增欄位作為業務鍵,改用 GUID 或業務編號。

參考資源

CSDN 相關文章

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