Как сделать обработку нужной ошибки в try catch?

355
03 мая 2017, 07:37

ИСПОЛЬЗУЕТСЯ
MySql
C#

Цель
Проверка на уникальность попадаемых данных в таблицу.

Сценарий
1. Код добавляет в таблицу БД в поле ssl_str ссылки типа /csharp-net-page2.html
Поле ssl_strиндексировано: UNIQUE INDEX ssl_str (ssl_str)
2. При попадании в поле неуникального значения код возвращает ошибку
MySql.Data.MySqlClient.MySqlException (0x80004005): Duplicate entry '/csharp-net-page2.html' for key 'ssl_str' в MySql.Data.MySqlClient.MySqlStream.ReadPacket() в MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int64& insertedId) в MySql.Data.MySqlClient.Driver.GetResult(Int32 statementId, Int32& affectedRows, Int64& insertedId) в MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force) в MySql.Data.MySqlClient.MySqlDataReader.NextResult() в MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior) в MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery()

Решение
1. Как сделать, чтобы try catch обрабатывало именно эту ошибку?
Т.е. если возвращается именно эта ошибка, то запись добавляется в другую таблицу.
2. Является ли такой способ оптимальным для решения задачи по определению уникальности добавляемой записи или есть другие способы более оптимальные?

Answer 1

Ловите соответствующий тип эксепшна:

try
{
    // попытка записи в базу
}
catch (MySqlException ex)
{
    if (ex.Number == 1586)
    {
        // обработка MySqlException исключения
    }
    else
    {
        throw;
    }
}

Список всех кодов исключения можно найти здесь.

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

Можно и проверять на присутствие в БД самому, но, по-моему мнению, этот способ вполне действенный.

PS: Спасибо @Nikita и @Igor за поправки.

READ ALSO
Неочевидное поведение итераторов

Неочевидное поведение итераторов

В одной книге встретил вот такое высказывание:

347
Процесс не может получить доступ к файлу С#

Процесс не может получить доступ к файлу С#

я делаю файловый менеджер на c#У меня возникла проблема(картинка прилагается)

427
OxyPlot LinearAxis конвертировать значение в DateTime

OxyPlot LinearAxis конвертировать значение в DateTime

Строится график значение по х от 0 до 1000Как конвертировать эти значение в DateTime? Нужно чтоб подписи на шкале были не (0, 100, 200

376
Как удалить пробелы из объекта?

Как удалить пробелы из объекта?

Необходимо удалить пробелы из объекта, через Trim() и Replace() - не получаетсяПишет, что ссылка на объект не указывает на экземпляр объекта

333