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 + ";";
我有一个访问权限 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 + ";";