在重用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 = ".."
循环之外,因为它永远不会改变。
- 如何将List 转换为Sql In语句的SqlParameter?
- 在Visual Studio中更新DataSet结构以匹配新的SQL数据库结构
- 使用DataReader读取日期
- SqlConnection.Open vs SqlConnection.OpenAsync – 这两者之间的区别是什么?
- 在ExecuteReader()中使用CommandBehavior.CloseConnection的用途/优点是什么
- Int32.TryParse()或(int?)command.ExecuteScalar()
- 使用带参数的命令时,临时表的“无效对象名称”
- 如何在使用ExecuteNonQuery()时收到错误消息?
- ADO.NET DataTable / DataRow线程安全