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

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

19.07.2023, 16:33. Показов 3740. Ответов 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
3371 / 2257 / 388
Регистрация: 14.08.2018
Сообщений: 7,647
Записей в блоге: 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
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,721
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
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,721
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
3371 / 2257 / 388
Регистрация: 14.08.2018
Сообщений: 7,647
Записей в блоге: 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
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,721
21.07.2023, 10:26
firnen_dragon, я вроде бы пример привёл более лаконичный) Где портянка catch'ей с finally в конце не нужны)
1
 Аватар для Andrey-MSK
3371 / 2257 / 388
Регистрация: 14.08.2018
Сообщений: 7,647
Записей в блоге: 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
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,721
21.07.2023, 11:01
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
А как же ловить ошибки SQL?
Я уже говорил: подписка на глобальный перехватчик исключений. Это в случае, когда по месту ты не знаешь что делать с исключением.
0
 Аватар для Andrey-MSK
3371 / 2257 / 388
Регистрация: 14.08.2018
Сообщений: 7,647
Записей в блоге: 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
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,721
21.07.2023, 11:21
Andrey-MSK, и это надо будет везде, где есть обращения к СУБД?) А если забыли?) Не проще вообще этого не делать нигде, кроме одного места?)

Более того: практическая польза этого кода какая, если он просто перевыбрасывает исключения, теряя при это часть стека вызовов?)
0
 Аватар для Andrey-MSK
3371 / 2257 / 388
Регистрация: 14.08.2018
Сообщений: 7,647
Записей в блоге: 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
14367 / 9468 / 1360
Регистрация: 21.01.2016
Сообщений: 35,721
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
3371 / 2257 / 388
Регистрация: 14.08.2018
Сообщений: 7,647
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
GitDOS: Когда я решил скрестить MS-DOS, GitHub и Claude
MaGz GoLd 08.07.2026
Привет, Киберфорум! Хочу поделиться своим проектом, который, надеюсь, вас заинтересует. GitDOS — это веб-приложение, которое позволяет запускать DOS в браузере с тремя крутыми фичами: диски живут в. . .
Учебный мини "цифровой двойник" = (Сервер = Java + Flask_питон )+(3D = Гугловскаая 4T nvideo + google colab) +( WMS = Odoo на Docker)
anaschu 07.07.2026
Увидел в требованиях к вакансии создателя имитационных моделей связку (REst + Api + WMS + Anylogic + питон + 3D Nvideo), и решил посмотреть, что это такое. Из этого всего я работал более менее. . .
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал. Оно само - говорит. Кто слышит тот слышит.
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru