Мне нужно ввести некоторые данные, полученные с веб-сайта 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();
Приведенный выше код выполняет свою работу. Однако есть ли лучший способ справиться с этой ситуацией? Я почти уверен, что могу найти ошибку или две в будущем, но я не могу этого доказать.
@LasseVågsætherKarlsen, вот почему я опубликовал пункт if (...). Игнорировать Только выбранное исключение.
Как обычно - не используйте добавить со значением.
@SM или Да. Я сделал замены между публикацией этого вопроса и ожиданием ваших ответов





Вы можете сформулировать запрос следующим образом, чтобы избежать ошибки:
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.
@РоджерВольф. . . BigQuery, MariaDB и более ранние версии MySQL требуют from для использования where (хотя SQL Server, Postgres, SQLite и MySQL 8+ этого не делают). Я никогда не помню, какие базы данных требуют и не требуют этого, поэтому я склонен просто вставить его.
@ Стив. . . Это тоже жизнеспособное решение. INSERT достаточно прост, поэтому я не вижу смысла использовать MERGE. Аарон Бертран предостерегает от MERGE, поэтому я склонен использовать альтернативные решения (mssqltips.com/sqlservertip/3074/…).
@GordonLinoff спасибо, ссылка очень интересная. вот и я тоже склоняюсь
@GordonLinoff очень интересные идеи, которые вы дали!
Посмотрите на ответ, предоставленный @GordonLinoff, но вот еще один совет. В настоящее время ваш код поглощает все исключения SqlException, даже те, которые не являются повторяющимися ключами. Да, вы показываете окно сообщения, но, возможно, было бы лучше поймать и проигнорировать только то, что вам нужно? Вы можете переписать предложение catch следующим образом:
catch (SqlException S) when (S.Number == 2627) { ... ignore ... }