2016-02-03 2 views
1

Итак, у меня есть база данных с уникальным ограничением нескольких столбцов. Очевидно, чтобы предотвратить дубликаты. При отладке моего приложения моя консоль полностью заполнена MySql.Data.MySqlClient.MySqlException sКак заставить MySql.Data.MySqlClient.MySqlException Дублировать запись

Есть ли способ подавить их, поскольку это предназначенная функция базы данных? Похоже, что исключение исключает это исключение. Он будет обрабатывать его на основе моего оператора catch(MySqlException e), но все же показывает MySql.Data.MySqlClient.MySqlException в консоли.

Вот мой код:

public void InsertNewTeamHistory(TeamHistoryRow teamHistoryRow) 
    { 
     //open connection 
     if (this.OpenConnection) 
     { 
      try 
      { 
       var query = 
        "INSERT INTO teamhistory(MatchURL, Date, TeamOne, TeamOneScore, TeamTwo, TeamTwoScore, Map, Event, Outcome) " + 
        "VALUES(?MatchURL, ?Date, ?TeamOne, ?TeamOneScore, ?TeamTwo, ?TeamTwoScore, ?Map, ?Event, ?Outcome)"; 

       //create command and assign the query and connection from the constructor 
       using (var cmd = new MySqlCommand(query, _connection)) 
       { 
        if (cmd.Connection.State == ConnectionState.Open) 
        { 
         cmd.Parameters.Add("?MatchURL", MySqlDbType.VarChar).Value = teamHistoryRow.MatchUrl; 
         cmd.Parameters.Add("?Date", MySqlDbType.Date).Value = teamHistoryRow.Date; 
         cmd.Parameters.Add("?TeamOne", MySqlDbType.VarChar).Value = teamHistoryRow.TeamOne; 
         cmd.Parameters.Add("?TeamOneScore", MySqlDbType.Int32).Value = teamHistoryRow.TeamOneScore; 
         cmd.Parameters.Add("?TeamTwo", MySqlDbType.VarChar).Value = teamHistoryRow.TeamTwo; 
         cmd.Parameters.Add("?TeamTwoScore", MySqlDbType.Int32).Value = teamHistoryRow.TeamTwoScore; 
         cmd.Parameters.Add("?Map", MySqlDbType.VarChar).Value = teamHistoryRow.Map; 
         cmd.Parameters.Add("?Event", MySqlDbType.VarChar).Value = teamHistoryRow.Event; 
         cmd.Parameters.Add("?Outcome", MySqlDbType.VarChar).Value = teamHistoryRow.Outcome; 

         //Execute command 
         cmd.ExecuteNonQuery(); 

         //close connection 
         this.CloseConnection(); 
        } 
        else 
        { 
         throw new Exception("Failed - Connection to the DB NOT open."); 
        } 
       } 
      } 
      catch (MySqlException e) 
      { 
       switch (e.Number) 
       { 
        case 1062: 
         Console.WriteLine("Found Duplicate TeamHistoryRow, Not Inserting."); 
         break; 
        case 0: 
         Console.WriteLine("Well, we fucked up."); 
         break; 
        default: 
         throw; 
       } 
      } 
      finally 
      { 
       try 
       { 
        this.CloseConnection(); 
       } 
       catch (Exception ex) 
       { 
        Console.WriteLine(ex); 
       } 
      } 
     } 
    } 
+0

Что вы хотите делать, если запись уже существует? Вы хотите обновить эту запись со значениями или просто проигнорировать вставку и продолжить? – Steve

+0

Игнорируйте вставку и продолжайте. Но я не хочу, чтобы он выводил «Exception throw»: «MySql.Data.MySqlClient.MySqlException» в MySql.Data.dll, так как я обрабатываю тысячи или строки в минуту, и мне очень сложно читать мои фактические выход программы. –

ответ

1

MySql имеет приятный и легкий в использовании функция, которая добавляет к выписке правило о том, что делать, если дубликат ключа найден.

INSERT INTO ..... ON DUPLICATE KEY UPDATE ..... 

Таким образом, ваш оператор запроса можно переписать в виде

INSERT INTO teamhistory(MatchURL, Date, TeamOne, TeamOneScore, TeamTwo, 
         TeamTwoScore, Map, Event, Outcome) 
         VALUES(?MatchURL, ?Date, ?TeamOne, 
         ?TeamOneScore, ?TeamTwo, ?TeamTwoScore, 
         ?Map, ?Event, ?Outcome) 
ON DUPLICATE KEY UPDATE MatchUrl = ?MatchUrl 

Это предполагает, что поле MatchUrl является ключом, который вызывает повторяющиеся исключения. Таким образом, когда ключ дубликат обнаружен SQL выполняет UPDATE ничего не меняя в своей таблице

Та же логика доступна в другой системе баз данных через стандартизированный command MERGE

+0

Фантастический, сэр! Большое спасибо. Это приводит к тому, что MySql 'cmd' завершается успешно, а не ошибка. КРАСИВАЯ! Я выбрал ваш ответ как лучший ответ! –

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