在重用SqlCommand和转换时,我应该调用Parameters.Clear吗?

我在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); } } } } 

由于您反复执行相同的查询,因此无需清除它们 – 您可以在循环外添加参数并将其填充到内部。

 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参数 – 它不起作用。

在这种情况下,您需要它,因为您需要设置新的参数值,所以它是正确的。

顺便说一句,搬家

 command.CommandText = ".." 

循环之外,因为它永远不会改变。