Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 28.10.2021
Сообщений: 33

При удалении записи и попытке удалить связанные с ней записи в другой таблице возникает ошибка

12.02.2022, 08:05. Показов 2379. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте у меня есть 2 таблицы в БДSalonMassaga. В первой таблице (Clients) поля IDClients, LastName, FirstName, Patronymica. Во второй (ReceptionOnline) поля IDReception (Первичный ключ), IDClients, IDWorkers, IDObonement, DateReception, TimeReception. Мне нужно чтобы при удалении клиента из базы удалялись и все его записи на приём они в таблице Reception. Но когда я пытаюсь это сделать возникает ошибка "При обновлении записей возникла ошибка. дополнительные сведения приведены в внутреннем исключении"

подключение к БД проходит через метод который находить в том же месте что и модель бд

C#
1
2
3
4
5
6
7
8
        public static SalonMassaga GetContext()
        {
            if(_context==null)
            {
                _context = new SalonMassaga();
            }
            return _context;
        }
Мой метод удаления
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
        private void BtnDelete_Click(object sender, RoutedEventArgs e)
        {
            Clients _clients = (sender as Button).DataContext as Clients; // сюда передается выбранная для удаления запись
            if (MessageBox.Show("Вы точно хотите удалить данного клиента из\n базы данных, а также отменить все записи?", "Внимание", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
            {
                try
                {
                    foreach(var item in SalonMassaga.GetContext().ReceptionOnline)
                    {
                        if(item.IDClients== _clients.IDClients)
                        {
                            SalonMassaga.GetContext().ReceptionOnline.Remove(item);
                        }
                    }
                    SalonMassaga.GetContext().Clients.Remove(_clients);
                    SalonMassaga.GetContext().SaveChanges();
                    DataGridClients.ItemsSource = SalonMassaga.GetContext().Clients.ToList();
                    MessageBox.Show("Запись удалена!");
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message.ToString());
                }
            }
        }
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.02.2022, 08:05
Ответы с готовыми решениями:

ошибка при удалении записи в таблице DataGridView
Добрый день. Сделал подключение к MySQL, вывод таблицы на экран. все норм. private: void tables() //Ф-ия подключается в БД и Вывод...

При удалении записи в дочерней таблице она пытается удалить запись в родительской.
MSSQL 7.0. Две таблицы - родительская и дочерняя. Естественно стоят ограничения PK и FK(внешний ключ). Если в дочерней таблице удаляю...

Удаление или изменение записи невозможно, в таблице имеются связанные записи
Доброй ночи. при удалении из родительской таблицы появляется ошибка "удаление или изменение записи невозможно в таблице имеются связанные...

17
Эксперт .NET
 Аватар для Usaga
14313 / 9393 / 1355
Регистрация: 21.01.2016
Сообщений: 35,427
12.02.2022, 08:40
Лучший ответ Сообщение было отмечено ArchSeib как решение

Решение

Цитата Сообщение от ArchSeib Посмотреть сообщение
Мне нужно чтобы при удалении клиента из базы удалялись и все его записи на приём они в таблице Reception.
Для этого внешним ключам можно настроить каскадирование. Гуглите: SQL, FOREIGN KEY, CASCADING.
1
 Аватар для Andrey-MSK
3354 / 2240 / 388
Регистрация: 14.08.2018
Сообщений: 7,574
Записей в блоге: 4
14.02.2022, 08:37
Цитата Сообщение от ArchSeib Посмотреть сообщение
Мне нужно чтобы при удалении клиента из базы удалялись и все его записи на приём они в таблице Reception.
Каскады это конечно хорошо, но это чревато последствиями.
Лучше удалить вначале записи из подчинённой таблицы
T-SQL
1
2
DELETE MySecondTable
WHERE IDFirstTable = 23
а потом уже из главной
T-SQL
1
2
DELETE MyFirstTable
WHERE IDFirstTable = 23
1
Эксперт .NET
 Аватар для Usaga
14313 / 9393 / 1355
Регистрация: 21.01.2016
Сообщений: 35,427
14.02.2022, 08:40
Цитата Сообщение от Andrey-MSK Посмотреть сообщение
но это чревато последствиями.
Какими?
1
 Аватар для Andrey-MSK
3354 / 2240 / 388
Регистрация: 14.08.2018
Сообщений: 7,574
Записей в блоге: 4
14.02.2022, 08:45
Usaga, Можно удалить всё оченно быстро, сервер даже ни о чём не спросит А тут будет хоть какая-то защита и разработчик чётко будет знать что делает

Добавлено через 1 минуту
Каскады это возможность из серии TRUNCATE
1
Эксперт .NET
 Аватар для Usaga
14313 / 9393 / 1355
Регистрация: 21.01.2016
Сообщений: 35,427
14.02.2022, 08:48
Andrey-MSK, ну, так когда разработчик добавляет каскад он же тоже понимает, что делает. Разве нет?
1
 Аватар для Andrey-MSK
3354 / 2240 / 388
Регистрация: 14.08.2018
Сообщений: 7,574
Записей в блоге: 4
14.02.2022, 08:56
Usaga, Опытный понимает, а вот начинающий не всегда. Потому для него лучше такую возможность сервера не использовать
Я так думаю (с) ...
1
Эксперт .NET
 Аватар для Usaga
14313 / 9393 / 1355
Регистрация: 21.01.2016
Сообщений: 35,427
14.02.2022, 10:48
Andrey-MSK, лучше использовать и при этом с головой) Видел я проект, который без каскадов был написан джунами... Сколько же там кода мусорного из-за этого было.
1
 Аватар для Andrey-MSK
3354 / 2240 / 388
Регистрация: 14.08.2018
Сообщений: 7,574
Записей в блоге: 4
14.02.2022, 10:53
Цитата Сообщение от Usaga Посмотреть сообщение
Сколько же там кода мусорного из-за этого было.
Делаешь SP для удаления на сервере с транзанкциями, RAISERROR и т.д., и в коде на C# ваще ничего нет, кроме вызова SP и параметров
1
Эксперт .NET
 Аватар для Usaga
14313 / 9393 / 1355
Регистрация: 21.01.2016
Сообщений: 35,427
14.02.2022, 10:55
Andrey-MSK, да без разницы где код, на C# или в базе. Суммарно один чёрт будет больше, чем нужно. Практический смысл сего в чём?) С таким же успехом давайте и от C# откажемся с его GC. Будем на Си malloc'и вызывать) Что уж)
2
 Аватар для Andrey-MSK
3354 / 2240 / 388
Регистрация: 14.08.2018
Сообщений: 7,574
Записей в блоге: 4
14.02.2022, 11:06
Usaga, Я просто решил предостеречь ТС про эту возможность, а так, пусть сам решает
Но если ошибётся, да еще и на боевом сервере, то хана данным, сервер по всей цепочке всё молча вытрет и усё...
0
Эксперт .NET
 Аватар для Usaga
14313 / 9393 / 1355
Регистрация: 21.01.2016
Сообщений: 35,427
14.02.2022, 11:09
Andrey-MSK, если он на такое будет способен, без тестирования на своей машине, то его никакие убранные каскады не спасут от похеривания данных) Такой человек найдёт как пустить всё под откос...
1
0 / 0 / 0
Регистрация: 28.10.2021
Сообщений: 33
14.02.2022, 13:18  [ТС]
Спасибо большое, почитал и вроде разобрался. Как я понял это нужно в самой бд делать, а не в VS

Добавлено через 10 минут
Я использую Entity framework. И пока искал про каскадное удаление увидел что Entity framework автоматически использует каскадное удаление. Так может ли быть ошибка в том что я пытался удалить то что он и сам мог удалить и из-за этого могла быть ошибка?
0
Эксперт .NET
 Аватар для Usaga
14313 / 9393 / 1355
Регистрация: 21.01.2016
Сообщений: 35,427
14.02.2022, 13:22
ArchSeib, он автоматически такое проделывает только для загруженных сущностей. А это сильно не "автоматически". И каскадирование происходит на уровне СУБД, а не ORM.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
14.02.2022, 13:44
Каскадные удаления (изменения) - штука как удобная, так и очень опасная.
С удобством понятно, с опасностью нужны пояснения.
Главным образом, опасность утери данных, особенно в "этажерках" из более, чем двух таблиц, заключается в случайных или ошибочных действиях как пользователя (спешил, нажал кнопки автоматически), так и программиста, который решил "подчистить" базу из Клиента (не приложения). И то, и другое, случается достаточно часто, - это опыт, и не только мой.
На исправление подобных "ошибок" уходит масса времени и нервов и хорошо, если есть свежий бэкап и можно на время восстановления данных отключить всех от сервера. А если нет ? Или бэкпапа или нельзя всем дать команду "Стоять, не двигаться !" ?.
Тогда нужно копать в логах, ручками строить запросы на вставки убитых записей. Или заставить пользователя ввести по новой данные с "бумажных" документов. Если, конечно, они есть А если брать серьезные системы типа ERP/MRP, то там есть цепочки операций (проводок) и восстановлением только самого документа дело не ограничится. Придется откатывать все операции, связанные с этим документом, а потом опять их выполнять.
Поэтому каскады опытными разрабами СУБД используются редко.

Что же касается "мусорного" кода. "мусорно" можно писать абсолютно всегда и везде. Правильно написанный код удаления из связанных таблиц не может быть длинным и запутанным.

Но в целом, конечно, полностью блокировать "ошибки от дурака" невозможно. Есть каскады или нет их, "обезьяны с гранатой", увы, находятся везде. Для борьбы с ними существует система журналирования и админсредства (вплоть до увольнения - в моей практике были такие случаи)
0
0 / 0 / 0
Регистрация: 28.10.2021
Сообщений: 33
14.02.2022, 15:19  [ТС]
С удалением я разобрался но теперь мне нужно наоборот чтобы при удалении записи из главной таблицы запись в дочерней не менялась. Как я понял это должно делать свойство NO ACTION, но я не могу найти как его использовать
0
 Аватар для Andrey-MSK
3354 / 2240 / 388
Регистрация: 14.08.2018
Сообщений: 7,574
Записей в блоге: 4
14.02.2022, 15:23
Цитата Сообщение от ArchSeib Посмотреть сообщение
NO ACTION
Одновременно CASCADE и NO ACTION нельзя применять, либо то, либо то.
Если нужно оставить все записи в подчинённой таблице, то перед удалением записи из главной нужно обнулить ID в подчиненной
T-SQL
1
2
3
UPDATE MySecondTable
SET IDMainTable = NULL
WHERE IDMainTable = 23
Только зачем это надо? Зачем хранить пустые записи?
0
0 / 0 / 0
Регистрация: 28.10.2021
Сообщений: 33
15.02.2022, 08:01  [ТС]
Ясно спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.02.2022, 08:01
Помогаю со студенческими работами здесь

При удалении учащихся из журнала удаляет все связанные записи с ним в остальных таблицах
При удалении учащихся из журнала удаляет все связанные записи с ним в остальных таблицах. В задании написано что это должен быть триггер....

Как удалить записи из таблицы связанные с другой таблицей?
Добрый день! Подскажите пожалуйста с такой штукой: есть в БД две таблицы: Users и Cars. В таблице Cars есть поле UserId, т.е. Cars связана...

При удалении одной строки в таблице удаляются все записи
Всем доброго времени суток. В процессе написания оболочки на С++ builder под базу Firebird возникла такая ситуация: в базе две таблицы -...

Ошибка при удалении записи
Здравствуйте, такая проблемка, есть база данных, в ней 4 связанных между собой таблицы, данные из одной из них выводятся в DBGrid, нужно...

Ошибка при удалении записи
Начал реализовывать удаление вылезла опять ошибка... string queryString = "DELETE FROM users WHERE u_id = ?"; OleDbCommand...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru