2013-01-17 13 views
6

我在ADO.NET中手動編寫事務。我正在使用的示例重用了SqlCommand,這似乎是一個好主意。重新使用SqlCommand進行轉換時,是否應該調用Parameters.Clear?

不過,我已經加入參數,以我的命令。

我的問題是:在下面的代碼,是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); 
      } 
     } 
    } 
} 
+0

爲什麼不在循環內部創建命令?或者創建一個可以一次完成所有更新的SQL語句,並完全避免循環? –

回答

6

由於您反覆執行相同的查詢,因此無需清除它們 - 您可以在循環外添加參數並將其填充到內部。

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(); 
} 

注 - you can't use parameters with IN as you've got here - 它不起作用。

+0

是的我剛剛發現有關IN子句,感謝您的鏈接 –

1

在這種情況下,你需要它,因爲你需要設置新的參數值,所以它的正確性。

順便說一句,移動

command.CommandText = ".." 

循環外也一樣,它永遠不會改變。

+0

感謝關於移動循環外線的提示 –

相關問題