2015-06-08 4 views
1

Я хочу обновить ~ 50 строк. Так что я делаю это в foreach Код работает без ошибок, но в базе данных изменений нет.C# MySQL Transaction commit

public void updateItems(List<product> prdList) 
    { 
     MySqlTransaction tr = null; 

     try 
     { 
      tr = this.con.BeginTransaction(); 

      MySqlCommand cmd = new MySqlCommand(); 
      cmd.Connection = con; 
      cmd.Transaction = tr; 

      foreach (product prd in prdList) 
      { 
       cmd.CommandText = "UPDATE products SET title='@title', quantity='@quantity' WHERE itemId LIKE '@itemId'"; 
       cmd.Parameters.AddWithValue("@title", prd.title); 
       cmd.Parameters.AddWithValue("@quantity", prd.quantity); 
       cmd.Parameters.AddWithValue("@itemId", prd.itemId); 

       cmd.ExecuteNonQuery(); 
      } 

      tr.Commit(); 
     } 
     catch (MySqlException ex) 
     { 
      try 
      { 
       tr.Rollback(); 
      } 
      catch (MySqlException ex1) 
      { 
       MessageBox.Show(ex1.ToString()); 
      } 

      MessageBox.Show(ex.ToString()); 
     } 
    } 

Если я печатаю строку запроса и запускаю ее на SQL-Bash, она отлично работает.

+2

Вы цитируете свои параметры. это не правильно. параметр входит в «голый», никогда не цитируемый. 'set title = @ title', а не' set title = '@ title''. –

+1

И не используйте 'AddWithValue', укажите конкретные типы, которые вы добавляете. – DavidG

ответ

2

Вы не должны использовать одинарные кавычки с вашими параметрами. С одинарными кавычками ваш запрос видит их как string literal, а не параметр.

cmd.CommandText = "UPDATE products SET [email protected], [email protected] WHERE itemId LIKE @itemId"; 

Кроме того, поскольку вы пытаетесь параметризировать LIKE часть, вам нужно использовать %..% part in your parameter part or like '%' + @itemId + '%'.

Кстати, если у вас есть более чем один prd в вашем prdList, вам нужно очистить все параметры в верхней части foreach петли.

foreach (product prd in prdList) 
{ 
    cmd.Parameters.Clear(); 
    ... 
    ... 
} 

В последний момент, не используйте AddWithValue больше. It may generate unexpected results sometimes. Используйте .Add() метод перегрузки, чтобы указать свой тип параметра и его размер. И не забудьте использовать using statement для автоматического управления вашими соединениями и командами.

+0

Пример DB: Itemid - 0001 Itemid - 00001 Теперь, если я ищу% Itemid я получаю 2 результаты или назад? – Phil795

+0

* Если я использую Parameters.Add() VS display ..... Добавить() ist veraltet: Использовать AddWithValue() – Phil795

0

изменить команду заявление, как этот

из

"UPDATE products SET title='@title', quantity='@quantity' WHERE itemId LIKE '@itemId'"; 

в

"UPDATE products SET [email protected], [email protected] WHERE itemId LIKE @itemId"; 

и не забудьте добавить

cmd.Parameters.Clear(); 

вы должны очистить параметр каждый цикл.

Смежные вопросы