OleDBCommand,多个命令

OleDBCommand, multiple commands

我有一个访问权限 table,我用它来跟踪每当导出其他数据时递增的数字。在

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();
      }
}

代码按预期工作,但有可能(虽然不太可能)在第二个命令中发生连接错误,这意味着我增加的数字丢失了。这发生在调试时,如果它发生在实时系统中,那就不好了。

通常在数据库环境中处理的方式是使用事务。这将导致一系列命令作为一个块成功或失败,如果中间发生错误,它将所有内容回滚到初始状态。

我从来没有用 Access 亲自做过这件事(用 SQL 服务器、MySql、Postgres 等做过很多次),但是有一个 OleDbConnection.BeginTransaction。此页面上有一个非常好的示例展示了如何使用它。

基于 comment in the MSDN forums,这似乎适用于 Access 的 Jet 数据库引擎:

Hi,

Indeed Microsoft Jet doesn't support System.Transactions and TransactionScope.

If you still want to use transactions, you can use native OleDB transactions: http://msdn2.microsoft.com/en-us/library/93ehy0z8.aspx

Cheers,

Florin

(信用 Florin Lazar - MSFT

另一种解决方案...

将在单个 update 命令中执行此操作,而不是 delete 后跟 insert。像这样:

cmd.CommandText = "UPDATE IncrementingNumberTable set [Num] = [Num] + 1 WHERE [Num]=" + curr + ";";