使用 SqlDataAdapter 填充 DataTable 後,刪除表中最後一筆資料並新增一筆,資料庫自增主鍵(ID)比 DataTable 內對應欄位大 1。導致以 DataTable 的 ID 作為刪除條件時失效。
SqlDataAdapter 預設不會在 Insert 後自動回寫資料庫生成的自增值(Identity)到 DataTable。DataTable 仍保留舊的暫時 ID(如 0 或遞增的本地值),與資料庫實際 ID 不一致。adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.Both; // 需配合 OUTPUT INSERTED.ID
// 或在 Insert 後手動執行 SELECT SCOPE_IDENTITY() 回填
adapter.Update(dataTable);
dataTable.Clear();
adapter.Fill(dataTable); // 重新從資料庫載入最新身份值
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
builder.RefreshSchema(); // 確保結構同步
RowUpdated 事件中獲取新 ID 並回寫 DataRow。DataTable 的自增欄位作為業務鍵,改用 GUID 或業務編號。