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 回答