我有一個訪問表,我用它來跟蹤一個數字,每當發生其他資料的匯出時該數字都會增加。在里面
using (OleDbConnection con = new OleDbConnection(DatabaseProvider DatabaseFilePath))
{
con.Open();
using (OleDbCommand cmd = con.CreateCommand())
{
cmd.CommandText = "DELETE FROM IncrementingNumberTable WHERE [Num]=" curr ";";
cmd.Connection = con;
cmd.ExecuteNonQuery();
}
curr ;
using (OleDbCommand cmd = con.CreateCommand())
{
cmd.CommandText = "INSERT INTO IncrementingNumberTable ([Num])VALUES(" curr ");";
cmd.Connection = con;
cmd.ExecuteNonQuery();
}
}
該代碼按預期作業,但有可能(雖然不太可能)在第二個命令中發生連接錯誤,這意味著我增加的數字丟失了。這發生在除錯時,如果它發生在實時系統中就不會很好。
uj5u.com熱心網友回復:
這通常在資料庫環境中處理的方式是使用事務。這會導致一系列命令作為一個塊成功或失敗,如果中間發生錯誤,它會將所有內容回滾到初始狀態。
我從來沒有親自用 Access 做過這件事(用 SQL Server、MySql、Postgres 等做過很多次),但是有一個OleDbConnection.BeginTransaction。這個頁面上有一個很好的例子展示了如何使用它。
根據MSDN 論壇中的評論,這似乎適用于 Access 的 Jet 資料庫引擎:
你好,
事實上,Microsoft Jet 不支持 System.Transactions 和 TransactionScope。
如果你仍然想使用事務,你可以使用原生的 OleDB 事務:http : //msdn2.microsoft.com/en-us/library/93ehy0z8.aspx
干杯,
弗羅林
(信用Florin Lazar - MSFT)
另一種解決方案...
將在單個update命令中執行此操作,而不是delete后跟一個insert. 像這樣的東西:
cmd.CommandText = "UPDATE IncrementingNumberTable set [Num] = [Num] 1 WHERE [Num]=" curr ";";
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/382300.html
上一篇:如何格式化顯示以進行數字對齊
