Как правильно обрабатывать исключение первичного ключа, когда я могу безопасно его игнорировать?

Мне нужно ввести некоторые данные, полученные с веб-сайта Hattrick (онлайн-менеджер футбола), в базу данных с помощью C#. Структура базы данных следующая:

MatchID (which is also primary key)
Rating1
Rating2
...
Rating16

Все поля TinyInt.

Так как данные задуманы, если я введу в базу MatchID который уже присутствует, я на 100% уверен, что другие поля RatingИкс будут иметь такое же значение, так что это исключение можно смело игнорировать, чтобы не заморачиваться Пользователь.

Для обработки этого исключения я использовал следующий код:

string AddMatchCommand = "Insert into Games values (@Match, @Ratings1, @Ratings2, @Ratings3, @Ratings4, @Ratings5, @Ratings6, @Ratings7, @Ratings8, @Ratings9, @Ratings10, @Ratings11, @Ratings12, @Ratings13, @Ratings14, @Ratings15, @Ratings16)";
SqlConnection MyConn = new SqlConnection(CreateTableConnectionString);  
SqlCommand command = new SqlCommand(AddMatchCommand, MyConn);  

command.Parameters.AddWithValue("@Match", MatchIDToInsert.ToString(CultureInfo.InvariantCulture));  
command.Parameters.AddWithValue("@Ratings1", RatingsToInsert[0].ToString(CultureInfo.InvariantCulture));  
command.Parameters.AddWithValue("@Ratings2", RatingsToInsert[1].ToString(CultureInfo.InvariantCulture));  
//...   
command.Parameters.AddWithValue("@Ratings16", RatingsToInsert[15].ToString(CultureInfo.InvariantCulture)); 

MyConn.Open();  
try  
{  
 command.ExecuteNonQuery();  
}  
catch (SqlException S)  
{  
 if (S.Number != 2627)  //2627 is the ID for the exception I want to ignore
 {  
  MessageBox.Show(S.Message);  
 }  
}  
MyConn.Close(); 

Приведенный выше код выполняет свою работу. Однако есть ли лучший способ справиться с этой ситуацией? Я почти уверен, что могу найти ошибку или две в будущем, но я не могу этого доказать.

Посмотрите на ответ, предоставленный @GordonLinoff, но вот еще один совет. В настоящее время ваш код поглощает все исключения SqlException, даже те, которые не являются повторяющимися ключами. Да, вы показываете окно сообщения, но, возможно, было бы лучше поймать и проигнорировать только то, что вам нужно? Вы можете переписать предложение catch следующим образом: catch (SqlException S) when (S.Number == 2627) { ... ignore ... }

Lasse V. Karlsen 26.05.2019 14:40

@LasseVågsætherKarlsen, вот почему я опубликовал пункт if (...). Игнорировать Только выбранное исключение.

Bogdan Doicin 26.05.2019 14:41

Как обычно - не используйте добавить со значением.

SMor 26.05.2019 15:38

@SM или Да. Я сделал замены между публикацией этого вопроса и ожиданием ваших ответов

Bogdan Doicin 26.05.2019 18:30
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете сформулировать запрос следующим образом, чтобы избежать ошибки:

Insert into Games
    select @Match, @Ratings1, @Ratings2, @Ratings3, @Ratings4, @Ratings5, @Ratings6, @Ratings7, @Ratings8, @Ratings9, @Ratings10, @Ratings11, @Ratings12, @Ratings13, @Ratings14, @Ratings15, @Ratings16
    where not exists (select 1 from Games g where g.matchid = @match);

Вам не нужно from, это не Oracle.

Roger Wolf 26.05.2019 15:29

@РоджерВольф. . . BigQuery, MariaDB и более ранние версии MySQL требуют from для использования where (хотя SQL Server, Postgres, SQLite и MySQL 8+ этого не делают). Я никогда не помню, какие базы данных требуют и не требуют этого, поэтому я склонен просто вставить его.

Gordon Linoff 26.05.2019 17:11

@ Стив. . . Это тоже жизнеспособное решение. INSERT достаточно прост, поэтому я не вижу смысла использовать MERGE. Аарон Бертран предостерегает от MERGE, поэтому я склонен использовать альтернативные решения (mssqltips.com/sqlservertip/3074/…).

Gordon Linoff 26.05.2019 17:17

@GordonLinoff спасибо, ссылка очень интересная. вот и я тоже склоняюсь

Steve 26.05.2019 17:35

@GordonLinoff очень интересные идеи, которые вы дали!

Bogdan Doicin 26.05.2019 18:30

Другие вопросы по теме