7

我需要使用 ADO.NET 提供程序的事务。

下面是一个正在创建的连接、事务和命令的简单示例。当我使用创建命令connection.CreateCommand()时,是否需要将事务分配给命令?或者,是否因为我正在使用connection.CreateCommand()vs 更新命令对象而设置了事务?

var connection = Database.GetConnection();
connection.Open();

var transaction = connection.BeginTransaction();

var command = connection.CreateCommand();
command.Transaction = transaction; // Is this line needed when using connection.CreateCommand()?

*更新*

当我测试两个对象的引用时,它们是相同的。我假设这意味着connection.CreateCommand()返回一个分配了事务的命令。或者这可能不是一个有效的测试。

using (var connection = Database.GetConnection())
{
    connection.Open();

    var transaction = connection.BeginTransaction();

    var command = connection.CreateCommand();

    if (object.ReferenceEquals(transaction, command.Transaction))
        Debug.WriteLine("EQUAL");
}
4

5 回答 5

2

您必须为每个SqlCommand实例显式设置事务。这是System.Data.SqlClient.SqlConnection.cs(Line:782)的源代码CreateCommand

new public SqlCommand CreateCommand() {
    return new SqlCommand(null, this);
}

正如你看到的; 它传递nullCommandTextthis本身)SqlConnection参数。

于 2015-04-20T08:11:02.290 回答
2

是的,事务和命令需要相互关联。

一些经过编辑的示例代码:

// Connect to the database.
SqlConnection connection = new SqlConnection(Database.ConnectionString);
connection.Open();

// Start a transaction.
SqlCommand command = new SqlCommand();
command.Connection = connection;
command.Transaction = connection.BeginTransaction(System.Data.IsolationLevel.Serializable, "ryan");

// Delete any previously associated targets.
command.CommandType = System.Data.CommandType.StoredProcedure;
command.CommandText = "FirstSP";
command.Parameters.AddWithValue("@Id", this.Id);
command.ExecuteNonQuery();

// Add the specified targets to the product.
command.CommandText = "SecondSP";
command.Parameters.Add("@Id", SqlDbType.Int);
foreach (int Id in Ids)
{
    command.Parameters["@Id"].Value = Id;
    command.ExecuteNonQuery();
}

// Commit the transaction.
command.Transaction.Commit();

// Houseclean.
connection.Close();
于 2012-12-28T20:38:13.347 回答
2

如果使用TransactionScope,则无需将任何内容附加到命令对象。

只需看一下TransactionScope.

于 2015-06-01T23:02:34.797 回答
0
using (var connection = new SqlConnection(Database.ConnectionString))
{
   connection.Open();
   using (var trans = connection.BeginTransaction())
   {
       using (var command = trans.Connection.CreateCommand())
       { 
          command.CommandText = 'DELETE FROM TABLE_NAME WHERE ID = ?'; 
          command.Transaction = trans;
          command.ExecuteNonQuery();
       }
       trans.Commit();
   }
}
于 2021-01-13T17:49:17.277 回答
-1

如果将connection.CreateCommand, 与已经启动事务的连接一起使用,则生成的命令对象将被列入事务(将设置命令的事务属性)。

如果您使用new Command,则必须明确设置事务。

于 2013-02-16T10:44:24.753 回答