我的情況涉及通過 ADO.NET 物件對 SQLite 資料庫中的單個表進行批量更新。我使用該DataAdapter.Update()方法來推送效果很好的更改:
DataTable changes = dataset.Tables[table].GetChanges();
if (changes == null) return 0;
SQLiteCommandBuilder scb = new SQLiteCommandBuilder(adapter);
scb.ConflictOption = ConflictOption.CompareRowVersion;
int cnt = adapter.Update(changes);
return cnt;
但是,每次插入記錄時,我還希望本地 DataSet 表反映新插入的行 ID。為此,我使用adapter_RowUpdated事件:
static void adapter_RowUpdated(object sender,
System.Data.Common.RowUpdatedEventArgs e)
{
if (e.StatementType == StatementType.Insert)
{
SQLiteCommand cmd = new SQLiteCommand("select last_insert_rowid();", conn);
e.Row["id"] = cmd.ExecuteScalar();
}
}
上面的提取last_insert_rowid()是因為我可以在通過放置斷點進行除錯時看到它。但是,賦值陳述句e.Row["id"]不起作用。id 更改未反映在我的原始物件DataSet和DataTable物件中。例如當我測驗下面的值時(N 指的是具體的行索引),它仍然有一個DBNull值。這里出了什么問題?如何確保剛剛插入的特定行使用其相應id的欄位值進行更新?
dataset.Tables["projects"].row[N]["id"];
uj5u.com熱心網友回復:
經過一番試驗,我自己找到了解決方案。
聽起來可能很奇怪,但看起來adapter.Update()需要一個資料集以及實際的表名才能使其作業。DataTable.GetChanges()到目前為止,我正在傳遞表物件 ( ),它完成了更新資料庫的作業,但僅在這種特定情況下失敗。在我這樣做的那一刻,插入的 id 開始反映在整個資料集的行中!
//int cnt = adapter.Update(changes); // doesn't work
int cnt = adapter.Update(dataset, tableName); // works perfectly!
編輯
瞧!當我像這樣傳遞表格而不是整個資料集時,它甚至可以作業。changes它只是在我剛剛經過桌子時才引起問題(來自dataset.Tables[tableName].GetChanges())。
int cnt = adapter.Update(dataset.Tables[tableName]); // works perfectly!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/514722.html
上一篇:從sql中的計數中選擇最大值
