Как правильно обрабатывать исключение первичного ключа, когда я могу его игнорировать? - PullRequest
1 голос
/ 26 мая 2019

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

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

Все поля TinyInt.

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

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

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

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

1 Ответ

4 голосов
/ 26 мая 2019

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

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...