Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 407

Как обработать исключение Duplicate entry(MySql)

19.07.2023, 16:33. Показов 3978. Ответов 69
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть у меня функция для sql запроса в базу, например такая:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
        public static long AddNewDocument(int typeId, string name, string description, string fileName)
        {
            try
            {
                MySqlConnection con = new MySqlConnection(connStr);
                con.Open();
                string sql = @"INSERT INTO document (type_id, name, description, filename) 
                        VALUES (" + typeId + ", '" + name + "', '" + description + "', '" + fileName + "');";
                MySqlCommand command = new MySqlCommand(sql, con);
                command.ExecuteNonQuery();
                con.Close();
                return command.LastInsertedId;
            }
            catch (InvalidCastException e)
            {
                MessageBox.Show(e.Message);
                return -1;
            }
        }
Если name будет совпадать с тем, что в базе, то получаю подобное исключение:
Code
1
Duplicate entry 'исправления  Storage' for key 'name_UNIQUE'
В try-catch не ловится. В основном все ответы на эту тему связаны с тем, что в базу кидаются неправильно подготовленные данные, но в моем случае пользователь сам выбирает этот документ в OpenFileDialog, и это пользователь, может выбрать тот документ который уже есть в базе.
Вопрос в том можно ли как-то обработать это исключение без дополнительного проверочного запроса?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
19.07.2023, 16:33
Ответы с готовыми решениями:

Как в EF пропускать исключения дубликатов MySqlException: Duplicate entry '1-4' for key 'PRIMARY'
Добрый день. Используется EntityFramework с MySQL. Модель многие ко многим. В одной категории может быть много сайтов, один сайт может...

Duplicate entry mysql вставлять дубликаты
Здравствуйте. Есть таблица id | val | dop 1 | 1 | 1 2 | 1 | 2 3 | 2 | 2 4 | 1 | 1 <- тут будет при вставке ошибка...

MySQL Error! Duplicate entry '1' for key 'user_id_2'
Столкнулся с такой проблемой, если добавить коментарий к одной статьи, а потом к другой то вылазит такая ошибка MySQL error in file:...

69
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,769
Записей в блоге: 4
20.07.2023, 17:16
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от firnen_dragon Посмотреть сообщение
транзакции так приемлемо
Нормально, только в документации советуют Rollback делать через try .. catch
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
catch (Exception ex)
{
    Console.WriteLine("Commit Exception Type: {0}", ex.GetType());
    Console.WriteLine("  Message: {0}", ex.Message);
 
    // Attempt to roll back the transaction.
    try
    {
        transaction.Rollback();
    }
    catch (Exception ex2)
    {
        // This catch block will handle any errors that may have occurred
        // on the server that would cause the rollback to fail, such as
        // a closed connection.
        Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType());
        Console.WriteLine("  Message: {0}", ex2.Message);
    }
}
Добавлено через 1 минуту
И еще на command Dispose() нужно вызывать в finally
1
Эксперт .NET
 Аватар для Usaga
14819 / 9600 / 1369
Регистрация: 21.01.2016
Сообщений: 36,145
20.07.2023, 17:35
Andrey-MSK, а зачем так заморочено? Почему не TransactionScope?
1
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 407
20.07.2023, 17:39  [ТС]
Andrey-MSK, Понял, я пробовал command.Dispose() вызывать в finally, но там command просто не видно, ну только, если их вот так объявлять глобально с пустым констркутором в начале:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
static public void AddContainer(int elementId, int count, int cellId, long operationId, string description)
{
    MySqlConnection con = new MySqlConnection(connStr);
    con.Open();
    MySqlTransaction transaction = con.BeginTransaction(IsolationLevel.ReadCommitted);
    MySqlCommand command1 = new MySqlCommand();
    MySqlCommand command2 = new MySqlCommand();
    try
    {
        string sql = "SELECT name+1 FROM container WHERE name = (SELECT max(name) FROM container);";
        command1 = new MySqlCommand(sql, con, transaction);
        string name = command1.ExecuteScalar().ToString();
        string sql1 = "INSERT INTO container (name, element_id, count, cell_id, operation_id, description) VALUES (" + name + ", " + elementId + ", " + count + ", " + cellId + ", '"+ operationId + "', '" + description + "');";
        command2 = new MySqlCommand(sql1, con, transaction);
        command2.ExecuteNonQuery();
        transaction.Commit();
    }
    catch (MySqlException mysqlEx)
    {
        try
        {
            transaction.Rollback();
        }
        catch (MySqlException mysqlEx2)
        {
            throw new ApplicationException(mysqlEx2.Message);
        }
        throw new ApplicationException(mysqlEx.Message);
    }
    catch (Exception e)
    {
        try
        {
            transaction.Rollback();
        }
        catch (MySqlException e2)
        {
            throw new ApplicationException(e2.Message);
        }
        throw new ApplicationException(e.Message);
    }
    finally
    {
        con.Close();
        command1.Dispose();
        command2.Dispose();
        transaction.Dispose();
        con.Dispose();
    }
}
0
Эксперт .NET
 Аватар для Usaga
14819 / 9600 / 1369
Регистрация: 21.01.2016
Сообщений: 36,145
20.07.2023, 17:49
firnen_dragon, что-то ты переусложнил всё.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        static public void AddContainer(int elementId, int count, int cellId, long operationId, string description)
        {
           var options = new TransactionOptions
           {
               IsolationLevel = IsolationLevel.ReadCommitted
           };
 
            using var scope = new TransactionScope(TransactionScopeOption.Required, options, TransactionScopeAsyncFlowOption.Enabled);
            using var con = new MySqlConnection(connStr);
            con.Open();
 
            var sql = "SELECT name+1 FROM container WHERE name = (SELECT max(name) FROM container);";
            var command1 = new MySqlCommand(sql, con, transaction);
            var name = command1.ExecuteScalar().ToString();
 
            var sql1 = "INSERT INTO container (name, element_id, count, cell_id, operation_id, description) VALUES (" + name + ", " + elementId + ", " + count + ", " + cellId + ", '"+ operationId + "', '" + description + "');";
 
            var command2 = new MySqlCommand(sql1, con, transaction);
            command2.ExecuteNonQuery();
 
            scope.Complete();
        }
Добавлено через 4 минуты
firnen_dragon, только я настоятельно рекомендую использовать параметрические запросы, а не конкатенацию.
2
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 407
20.07.2023, 17:56  [ТС]
Usaga, Понял, принял посмотрю, учту, спасибо
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
20.07.2023, 18:20
Цитата Сообщение от firnen_dragon Посмотреть сообщение
в моем случае пользователь сам выбирает этот документ в OpenFileDialog
А значения name и description пользователи тоже сами вводят?
0
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 407
21.07.2023, 09:19  [ТС]
kolorotur, name - берется из OpenFileDialog(тобеж это просто название файла без расширения), а description - да тоже вводится пользователем
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,769
Записей в блоге: 4
21.07.2023, 09:29
Нашел статейку по TransactionScope - Инфраструктура System.Transactions в мире .NET
1
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 407
21.07.2023, 10:17  [ТС]
Andrey-MSK, кстати, чтоб command.Dispose() не вызывать в finaly можно в принципе команды в юзинг обернуть и убрать catch (MySqlException mysqlEx), потомоу что Exception вроде как все исключения отлавливает в том числе и связанные с MySql:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
static public void AddContainer(int elementId, int count, int cellId, long operationId, string description)
{
    MySqlConnection con = new MySqlConnection(connStr);
    con.Open();
    MySqlTransaction transaction = con.BeginTransaction(IsolationLevel.ReadCommitted);
    try
    {
        string name;
        using (MySqlCommand command1 = new MySqlCommand("SELECT name+1 FROM container WHERE name = (SELECT max(name) FROM container);", con, transaction))
        {
            name = command1.ExecuteScalar().ToString();
        }
        using (MySqlCommand command2 = new MySqlCommand("INSERT INTO container (name, element_id, count, cell_id, operation_id, description) VALUES (" + name + ", " + elementId + ", " + count + ", " + cellId + ", '" + operationId + "', '" + description + "');", con, transaction))
        {
            command2.ExecuteNonQuery();
        }
        transaction.Commit();
    }
    catch (Exception e)
    {
        try
        {
            transaction.Rollback();
        }
        catch (Exception e2)
        {
            throw new ApplicationException(e2.Message);
        }
        throw new ApplicationException(e.Message);
    }
    finally
    {
        con.Close();
        transaction.Dispose();
        con.Dispose();
    }
}
0
Эксперт .NET
 Аватар для Usaga
14819 / 9600 / 1369
Регистрация: 21.01.2016
Сообщений: 36,145
21.07.2023, 10:26
firnen_dragon, я вроде бы пример привёл более лаконичный) Где портянка catch'ей с finally в конце не нужны)
1
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,769
Записей в блоге: 4
21.07.2023, 10:29
Цитата Сообщение от firnen_dragon Посмотреть сообщение
можно в принципе команды в юзинг обернуть
Я вам про это уже говорил
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
И если не используете using, то finally нужно записать вот так
Добавлено через 1 минуту
Цитата Сообщение от Usaga Посмотреть сообщение
Где портянка catch'ей
А как же ловить ошибки SQL?
1
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 407
21.07.2023, 10:41  [ТС]
Usaga, Да у меня просто огромный класс для работы с MySql где куча подобных методов, которые я уже вчера начал переписывать по подобию тех примеров которые привел Andrey-MSK, и я там вроде понял как все работает, ваш пример я тоже разобрал, но в нем мне не все понятно пока, например тоже не понял почему не нужен try-catch и как в таком случае отлавливаются исключения.
0
Эксперт .NET
 Аватар для Usaga
14819 / 9600 / 1369
Регистрация: 21.01.2016
Сообщений: 36,145
21.07.2023, 11:01
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
А как же ловить ошибки SQL?
Я уже говорил: подписка на глобальный перехватчик исключений. Это в случае, когда по месту ты не знаешь что делать с исключением.
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,769
Записей в блоге: 4
21.07.2023, 11:14
Usaga, Хмммм.... Ну вроде как проще сделать на месте
C#
1
2
3
4
5
6
7
8
catch (SqlException sqlEx)
{
    throw new ApplicationException(string.Format("T-SQL #{0} - {1}", sqlEx.Number, sqlEx.Message));
}
catch (Exception ex)
{
    throw new ApplicationException(ex.Message);
}
0
Эксперт .NET
 Аватар для Usaga
14819 / 9600 / 1369
Регистрация: 21.01.2016
Сообщений: 36,145
21.07.2023, 11:21
Andrey-MSK, и это надо будет везде, где есть обращения к СУБД?) А если забыли?) Не проще вообще этого не делать нигде, кроме одного места?)

Более того: практическая польза этого кода какая, если он просто перевыбрасывает исключения, теряя при это часть стека вызовов?)
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,769
Записей в блоге: 4
21.07.2023, 11:30
Цитата Сообщение от Usaga Посмотреть сообщение
кроме одного места
Можно пример? Просто первый раз про такое слышу...
0
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 407
21.07.2023, 11:35  [ТС]
Usaga, Это получается я могу написать подобным образом как вы показали здесь?https://learn.microsoft.com/en... ew=net-7.0 в APP (если речь о WPF) и все исключения со всего приложения будут попадать туда? звучит как очень мощное заклинание
1
Эксперт .NET
 Аватар для Usaga
14819 / 9600 / 1369
Регистрация: 21.01.2016
Сообщений: 36,145
21.07.2023, 11:39
Andrey-MSK, firnen_dragon, речь об этом: https://learn.microsoft.com/en... ew=net-7.0

Добавлено через 1 минуту
Есть ещё такое событие, из той же оперы: тыц
2
 Аватар для firnen_dragon
25 / 25 / 4
Регистрация: 21.01.2019
Сообщений: 407
21.07.2023, 11:40  [ТС]
Тут вот во втором ответе для wpf(в APP) перехват глобальный реализован:https://stackoverflow.com/ques... pplication
Интересно конечно
0
 Аватар для Andrey-MSK
3397 / 2283 / 388
Регистрация: 14.08.2018
Сообщений: 7,769
Записей в блоге: 4
21.07.2023, 11:42
firnen_dragon, Хмммм, итерееесноооо... Но придется писать несколько вариантов Exception (можно наверное через switch попробовать) в методе перехвата, для SQL, Application ну и что там ещё надо. Что-бы выдавала красивые сообщения, согласно возможностей исключения...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.07.2023, 11:42

Duplicate entry
Пытаюс выполнить запрос в MySQL сервере: INSERT INTO hosts (host, kod) VALUES ('ааааа', 1)Получаю ошибку: Duplicate entry '0' for key 1 ...

SqlExceptionHelper.logExceptions Duplicate entry
Запись создается но в stacktrace много ошибок , соответственно страницы не загружаются. Почему ? DROP SCHEMA IF EXISTS...

Duplicate entry '28' for key 'id_u'
Доброго времени суток! Столкнулся с проблемой, при добавлении вакансий пользователем на сайте. А именно: 1 пользователь не может добавить...

'Duplicate entry '0' for key 'PRIMARY''
Помогите с ошибкой... MySql.Data.MySqlClient.MySqlException: 'Duplicate entry '0' for key 'PRIMARY'' Она вылезает, когда я пытаюсь...

Ошибка Duplicate entry '10' for key 1
Есть скрипт добавление новостей. В файле конфига есть значение newsnum, которое регулирует количество выводимых на главную страницу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru