2013-01-17 6 views
6

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); 
      } 
     } 
    } 
} 
+0

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? –

Odpowiedz

6

Ponieważ wielokrotnie wykonujesz to samo zapytanie, nie trzeba ich usuwać - możesz dodać parametry poza pętlą i wypełnić je wewnątrz.

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

Uwaga - you can't use parameters with IN as you've got here - to nie zadziała.

+0

tak właśnie odkryłem, że o klauzuli IN, dzięki za link –

1

W tym stanie potrzebujesz go, ponieważ potrzebujesz ustawić nowe wartości parametrów, więc jest to poprawne.

Nawiasem mówiąc, przesuń

command.CommandText = ".." 

zewnątrz pętli też, jak to nigdy nie zmieniło.

+0

dzięki za cynk o przeniesieniu linii poza pętlę –

Powiązane problemy