【问题标题】:OleDBCommand, multiple commandsOleDBCommand,多个命令
【发布时间】:2023-03-04 12:00:01
【问题描述】:

我有一个访问表,用于跟踪每当导出其他数据时递增的数字。在

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

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

【问题讨论】:

  • 一旦记录存在,UPDATE 查询不是更适合吗?使用参数避免sql注入和格式错误。搜索“数据库事务”以获取有关更新多条记录等的信息。

标签: c# ms-access oledb


【解决方案1】:

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

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

基于comment in the MSDN forums,看来这适用于 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 + ";";

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 2016-06-02
    • 2021-11-09
    • 2017-03-09
    相关资源
    最近更新 更多