3

次の 2 つのコード ブロックのいずれかを使用する正当な理由があるかどうか、誰か教えていただけますか?

using (SqlTransaction mySqlTransaction = mySqlConnection.BeginTransaction)
{
    using (SqlCommand mySqlCmd =
        new SqlCommand("First of many SQL statements here", mySqlConnection, mySqlTransaction)
    {
        mySqlCmd.Parameters.Add("@MyFirstParm", SqlDbType.Int).Value = myFirstVal;
        mySqlCmd.ExecuteNonQuery();
    }

    using (SqlCommand mySqlCmd =
        new SqlCommand("Second of many SQL statements here", mySqlConnection, mySqlTransaction)
    {
        mySqlCmd.Parameters.Add("@MySecondParm", SqlDbType.Int).Value = mySecondVal;
        mySqlCmd.ExecuteNonQuery();
    }

    .
    .
    .

    sqlTransaction.Commit();
}

対。

using (SqlTransaction mySqlTransaction = mySqlConnection.BeginTransaction)
{
    using (SqlCommand mySqlCmd = new SqlCommand("", mySqlConnection, mySqlTransaction)
    {
        mySqlCmd.Parameters.Add("@MyFirstParm", SqlDbType.Int).Value = myFirstVal;
        mySqlCmd.Parameters.Add("@MySecondParm", SqlDbType.Int).Value = mySecondVal;

        mySqlCmd.CommandText = "First of many SQL statements here";
        mySqlCmd.ExecuteNonQuery();

        mySqlCmd.CommandText = "Second of many SQL statements here";
        mySqlCmd.ExecuteNonQuery();

        .
        .
        .
    }

    sqlTransaction.Commit();
}
4

3 に答える 3

2

それぞれに新しいパラメーターのセットがあるため、1 を使用しますSqlCommand

また、これらを別のメソッドに移動するか、sproc として実行することもお勧めします。

于 2013-10-17T13:13:23.830 に答える
1

A の利点: 2 つの別個のコマンドは、2 つのステートメントに同じコマンドを使用するよりもやや混乱が少なく、コマンド 1 に影響を与えずにコマンド 2 の SQL コマンドのオーバーロードを変更できます B の利点: 使用するリソースとコードがわずかに少なくなります (それが重要な場合) )

両方の利点: 単一のメソッドを try キャッチでラップして、トランザクションがコミットされるために両方が成功する必要があるようにすることができます。それ以外の場合はロールバックします。

両方の欠点: 現代のメソッド内で SQL をハード コーディングすることは非常に危険です。これらのパラメータが UI オブジェクトのテキスト フィールドから来ている場合、DB が SQL インジェクション攻撃によって台無しになる可能性があります。1 つの db メソッドで 2 つの別個のステートメントを実行すると、ストアド プロシージャ内でステートメントを処理するだけでなく、混乱を招きます。また、ストアド プロシージャを使用し、commandtype を commandtype.storedprocedure に変更すると、パラメータを介した SQL インジェクション攻撃を防ぐことができます (ほとんどの場合)。SQL インジェクションに関する優れた記事はたくさんありますが、ここに関連記事があります。

http://blogs.msdn.com/b/raulga/archive/2007/01/04/dynamic-sql-sql-injection.aspx

于 2013-10-17T13:36:33.380 に答える
0

しかし、あなたの場合、3番目のオプションは、2つのパラメーターを取り、すべてのステートメントを内部的に実行するストアドプロシージャにすることができます。この場合、必要なexecuteNonQuery命令は 1 つだけです。

于 2013-10-17T13:18:10.503 に答える