9

SqlCommandこのコンストラクターがオーバーロードする理由は何でしょうか。

public SqlCommand(
    string cmdText,
    SqlConnection connection,
    SqlTransaction transaction
)

SqlTransaction引数として提供されたトランザクションを使用してビットを実行する内部メソッドを作成する必要がある場合、接続は明らかにであるため、常にそのメソッドにのみ渡すだけで十分であることがわかりますtran.Connection
同じことがこの過負荷にも当てはまりませんか?cmdText合格するだけでは十分ではないでしょうtransactionか?

のに対して開かれたものSqlCommandを提供して、接続に対して実際に実行することは可能ですか?これは何になりますか?SqlTransaction SqlConnection

4

1 に答える 1

4

別の接続からトランザクションを使用することはできないため、これは興味深い観察です。System.Data.SqlClient.SqlCommand(4.0)には、 ValidateCommandというプライベートメンバーがあり、これには次のようないくつかの検証チェックが含まれています。

if ((this._transaction != null) && (this._activeConnection != this._transaction.Connection))
{
    throw ADP.TransactionConnectionMismatch();
}

SqlCommandクラスの全体的な設計は、柔軟性を目的としています。CommandText、Connection、およびTransactionプロパティ(これらは3つの追加のコンストラクターオーバーロードでも公開されます)は読み取り/書き込みです。これにより、クラスは柔軟になりますが、誤った使用法になりやすくなります。

確かに、プロパティが読み取り専用であり、コンストラクターがデータをオブジェクトに渡すための主要な手段として使用されている場合、状況ははるかにクリーンになります。この場合、次のコンストラクターの方がはるかに理にかなっています。

public SqlCommand(string commandText, SqlTransaction transaction)

ただし、これらのプロパティは読み取り/書き込み可能であり、オブジェクトがデフォルトのコンストラクターを使用して構築され、プロパティがInitializeComponentメソッドで設定されるドラッグアンドドロップデザイナーのサポートを有効にすると思います。

于 2011-03-01T18:16:48.400 に答える