Mam kodowanie transakcji ręcznie w ADO.NET. Przykład, z którego pracuję, wykorzystuje ponownie SqlCommand
, co wydaje się dobrym pomysłem.Czy powinienem wywołać Parameters.Clear przy ponownym użyciu SqlCommand z transation?
Jednak dodałem parametry do mojego polecenia.
Moje pytanie brzmi: w poniższym kodzie, czy command.Parameters.Clear()
jest poprawne? Czy robię to źle?
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);
}
}
}
}
Dlaczego po prostu nie utworzysz polecenia wewnątrz pętli? Lub utworzyć instrukcję SQL, która może wykonać wszystkie aktualizacje za jednym razem i całkowicie uniknąć pętli? –