9

ADO.NET で手動でトランザクションをコーディングしています。私が取り組んでいる例では、 を再利用していますが、SqlCommandこれは素晴らしいアイデアのようです。

ただし、コマンドにパラメーターを追加しました。

私の質問は次のとおりです。次のコードはcommand.Parameters.Clear()正しいですか? それとも私はそれを間違っていますか?

using (var connection = new SqlConnection(EomAppCommon.EomAppSettings.ConnStr))
{
    connection.Open();
    SqlTransaction transaction = connection.BeginTransaction();
    SqlCommand command = connection.CreateCommand();
    command.Transaction = transaction;
    try
    {
        foreach (var itemIDs in this.SelectedItemIds)
        {
            command.CommandText = "UPDATE Item SET payment_method_id = @batchID WHERE id in (@itemIDs)";
            // IS THE FOLLOWING CORRECT?
            command.Parameters.Clear();

            command.Parameters.Add(new SqlParameter("@batchID", batchID));
            command.Parameters.Add(new SqlParameter("@itemIDs", itemIDs));
            command.ExecuteNonQuery();
        }
        transaction.Commit();
    }
    catch (Exception ex)
    {
        MessageBox.Show("Failed to update payment batches, rolling back." + ex.Message);
        try
        {
            transaction.Rollback();
        }
        catch (Exception exRollback)
        {
            if (!(exRollback is InvalidOperationException)) // connection closed or transaction already rolled back on the server.
            {
                MessageBox.Show("Failed to roll back. " + exRollback.Message);
            }
        }
    }
}
4

2 に答える 2

12

同じクエリを繰り返し実行しているので、それらをクリアする必要はありません。ループの外側にパラメータを追加して、内側に入力するだけです。

try
{
    command.CommandText = "UPDATE Item SET payment_method_id = @batchID WHERE id in (@itemIDs)";
    command.Parameters.Add(new SqlParameter("@batchID", 0));
    command.Parameters.Add(new SqlParameter("@itemIDs", ""));

    foreach (var itemIDs in this.SelectedItemIds)
    {
        command.Parameters["@batchID"].Value = batchID;
        command.Parameters["@itemIDs"].Value = itemIDs;
        command.ExecuteNonQuery();
    }
    transaction.Commit();
}

注-ここにあるように、INでパラメーターを使用することはできません-それは機能しません。

于 2013-01-17T08:10:43.513 に答える
1

この状態では、新しいパラメーター値を設定する必要があるため、それが必要なので、正しいです。

ちなみに移動

command.CommandText = ".."

決して変更されないため、ループの外側でも。

于 2013-01-17T08:08:43.423 に答える