我有一个access表,用于跟踪每当发生其他数据导出时递增的数字。在
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();
}
}代码按预期工作,但在第二个命令中出现连接错误是可能的,尽管不太可能,这意味着我的递增号丢失了。这是在调试时发生的,如果它发生在一个活动的系统中,那就不是很好了。
发布于 2021-12-09 21:58:44
通常在数据库环境中处理这个问题的方式是使用事务。这将导致一系列命令作为块成功或失败,如果在中间发生错误,则会将所有内容回滚到初始状态。
我从来没有用Access (使用Server、MySql、Postgres等)做过很多次,但是有一个OleDbConnection.BeginTransaction。这个页面上有一个很好的例子,展示了如何使用它。
基于在MSDN论坛上的评论,这似乎适用于Access‘Jet数据库引擎:
嗨, 事实上,Microsoft不支持System.Transactions和TransactionScope。 如果仍然希望使用事务,则可以使用本机OleDB事务:http://msdn2.microsoft.com/en-us/library/93ehy0z8.aspx。 干杯, 弗洛林
另一个解决方案..。
这将是在一个update命令中执行此操作,而不是delete后面跟着一个insert。就像这样:
cmd.CommandText = "UPDATE IncrementingNumberTable set [Num] = [Num] + 1 WHERE [Num]=" + curr + ";";https://stackoverflow.com/questions/70297165
复制相似问题