7

ADO.NET プロバイダーでトランザクションを使用する必要があります。

以下は、作成される接続、トランザクション、およびコマンドの簡単な例です。を使用してコマンドを作成する場合、コマンドconnection.CreateCommand()にトランザクションを割り当てる必要がありますか? connection.CreateCommand()または、コマンド オブジェクトを使用しているためにトランザクションが設定されていますか?

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インスタンスごとにトランザクションを明示的に設定する必要があります。の(行: 782)ソース コードはSystem.Data.SqlClient.SqlConnection.csCreateCommand次のとおりです。

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

ご覧のとおり。nullforCommandTextおよびthis(それ自体) forSqlConnection引数を渡します。

于 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 に答える
-1

すでにトランザクションを開始している接続でを使用するconnection.CreateCommandと、結果のコマンドオブジェクトがトランザクションに参加します(コマンドのトランザクションプロパティが設定されます)。

使用するnew Command場合は、トランザクションを明示的に設定する必要があります。

于 2013-02-16T10:44:24.753 に答える