Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
azhty
0 / 0 / 0
Регистрация: 10.03.2017
Сообщений: 4
1

Конфликт инструкции INSERT с ограничением FOREIGN KEY

22.05.2017, 21:17. Просмотров 1229. Ответов 28
Метки нет (Все метки)

Конфликт инструкции INSERT с ограничением FOREIGN KEY "FK_komnaty_klienty". Конфликт произошел в базе данных "Gostinitca", таблица "dbo.klienty", column 'Kod_klienta'.
Создана БД на SQL Server,выбраны первичные ключи во всех таблицах. БД подключена к visual studio(asp.net). Добавлена таблица в GridView. Нужно добавлять новые данные в таблицу, но при нажатии на кнопку Добавить выходит данная ошибка, и ругается на db.SubmitChanges();Вот весь код кнопки Добавить.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        protected void Button1_Click(object sender, EventArgs e)
    {
        KlietydbDataContext db = new KlietydbDataContext();
        klienty tebl = new klienty();
        tebl.Familiya = TextBox1.Text;
        tebl.Imya = TextBox2.Text;
        tebl.Otchectvo = TextBox3.Text;
        tebl.Nomer_komnaty = Convert.ToInt32(TextBox4.Text);
        tebl.Vid_dokumenta = TextBox5.Text;
        tebl.Nomer_dokumenta = TextBox6.Text;
        tebl.Mesto_zitelstva = TextBox7.Text;
        tebl.Plata_za_prozivanie = Convert.ToDecimal(TextBox10.Text);
        db.klienty.InsertOnSubmit(tebl);
      db.SubmitChanges(); //здесь
        Response.Redirect("/Klienty.aspx");
 
    }
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.05.2017, 21:17
Ответы с готовыми решениями:

Конфликт инструкции INSERT с ограничением Foreign Key
Здравствуйте! В БД есть таблица, в которой содержатся внешние ключи с разрешенным значением NULL....

Конфликт инструкции INSERT с ограничением FOREIGN KEY
вот код using System; using System.Collections.Generic; using System.ComponentModel; using...

Ошибка при INSERT. Нарушение FOREIGN KEY constraint.
Выползает вот такая ошибка: System.Data.SqlClient.SqlException: The INSERT statement conflicted...

The INSERT statement conflicted with the FOREIGN KEY constraint "FK_Main_ToWorker"
Добрый день. Пытаюсь добавить запись в базу данных выдает эту ошибку...

Ошибка при INSERT: "Cannot add or update a child row: a foreign key constraint fails"
Здравствуйте. Задача- есть несколько дата грид вьюшек. в них отображаются данные разных таблиц...

28
hoolygan
356 / 283 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
22.05.2017, 22:09 2
Ну скорее всего добавляете запись, которой не существует в таблице, на которую ссылается внешний ключ.
0
Aferuga
370 / 356 / 238
Регистрация: 20.05.2015
Сообщений: 1,049
Завершенные тесты: 1
23.05.2017, 09:35 3
Судя по всему код клиента хоть и первичный ключ, но не автоинкриминтируемый(если это так его либо надо прописывать вручную, либо выставлять автоинкремент на стороне базы).
0
Leslov
3 / 3 / 0
Регистрация: 13.10.2016
Сообщений: 48
Завершенные тесты: 1
29.01.2018, 13:00 4
Цитата Сообщение от hoolygan Посмотреть сообщение
Ну скорее всего добавляете запись, которой не существует в таблице, на которую ссылается внешний ключ.
А можно ли как-нибудь разрешить ссылаться на несуществующую запись?
0
hoolygan
356 / 283 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
29.01.2018, 14:15 5
Leslov, Вариантов у Вас несколько.
1. Удалить внешний ключ, т.е. перестать ссылаться на запись в другой таблице. Это повлечет возможные проблемы с логической целостностью данных. Не зря же ввели внешний ключ для этих целей.
2. Перед вставкой в таблицу, что требует проверки внешнего ключа - вставлять данные в "главную" таблицу, и брать с неё ключ для вставки в "slave"-табличку.
0
Leslov
3 / 3 / 0
Регистрация: 13.10.2016
Сообщений: 48
Завершенные тесты: 1
29.01.2018, 14:45 6
hoolygan, то есть, если и ссылаться, то только на уже существующую запись в таблице?

Допустим есть две таблицы: Documents (D) и Organizations (O). Одно из полей таблицы D ссылается на первичный ключ таблицы O. В качестве первичного ключа выступает GUID, причем не генерируемый автоматически, он всегда указывается явно при добавлении записи в таблицу.
При добавлении записи в таблицу D нам известен GUID организации, записи которого может не быть в таблице O. Идея в том, чтобы заполнять недостающие данные об организации уже после добавления документа, временно ссылаясь на отсутствующую запись.
Реализуемо ли это?
0
Cupko
463 / 452 / 127
Регистрация: 17.07.2012
Сообщений: 1,345
Записей в блоге: 1
Завершенные тесты: 2
29.01.2018, 15:49 7
Leslov, так делать нельзя, ибо это приводит к неконсистентности данных в БД. Либо заливайте все данные в транзакции, либо создавайте пустые записи в связанной таблице, и потом уже заполняйте все поля при помощи UPDATE/MERGE
1
Usaga
Эксперт .NET
5547 / 3750 / 663
Регистрация: 21.01.2016
Сообщений: 14,952
Завершенные тесты: 2
29.01.2018, 16:10 8
Leslov, внешний ключ имеет право ссылаться ни на что (null). Для этого его нужно создать со специальной настройкой.
0
Cupko
463 / 452 / 127
Регистрация: 17.07.2012
Сообщений: 1,345
Записей в блоге: 1
Завершенные тесты: 2
29.01.2018, 16:20 9
Цитата Сообщение от Usaga Посмотреть сообщение
внешний ключ имеет право ссылаться ни на что (null). Для этого его нужно создать со специальной настройкой.
Ну ссылаться ни на что (NULL) и ссылаться на несуществующий PK - разные вещи.
0
Usaga
Эксперт .NET
5547 / 3750 / 663
Регистрация: 21.01.2016
Сообщений: 14,952
Завершенные тесты: 2
29.01.2018, 16:30 10
Cupko, я это понимаю и мой совет этому не противоречит.
0
Leslov
3 / 3 / 0
Регистрация: 13.10.2016
Сообщений: 48
Завершенные тесты: 1
12.02.2018, 12:41 11
Нашел решение, подойдет для тех, кто использует миграции для обновления БД. Перед применением изменений нужно изменить файл миграции дописав строчку
C#
1
Sql("ALTER TABLE dbo.Users NOCHECK CONSTRAINT [FK_dbo.Users_dbo.Roles_RoleID]");
где
Users - основная таблица
Roles - таблица, на которую ссылается Users
RoleID - поле в таблице Users
0
Usaga
Эксперт .NET
5547 / 3750 / 663
Регистрация: 21.01.2016
Сообщений: 14,952
Завершенные тесты: 2
12.02.2018, 14:04 12
Leslov, вы осознаёте эффект от работы NOCHECK CONSTRAINT?
0
Leslov
3 / 3 / 0
Регистрация: 13.10.2016
Сообщений: 48
Завершенные тесты: 1
12.02.2018, 14:16 13
Usaga, нет. Какие-нибудь подводные камни?
0
Usaga
Эксперт .NET
5547 / 3750 / 663
Регистрация: 21.01.2016
Сообщений: 14,952
Завершенные тесты: 2
12.02.2018, 14:17 14
Leslov, так вы отключаете проверку ограничения при вставке и обновлении данных, что легко приведёт к повреждению данных. Не надо так делать. Это для самых запущенных случаев, когда по другому просто никак.
0
Leslov
3 / 3 / 0
Регистрация: 13.10.2016
Сообщений: 48
Завершенные тесты: 1
12.02.2018, 14:47 15
Цитата Сообщение от Usaga Посмотреть сообщение
что легко приведёт к повреждению данных.
Можно какой-нибудь простой пример? Пока планирую использовать этот вариант, т.к. более изящного решения не нашел.
0
Usaga
Эксперт .NET
5547 / 3750 / 663
Регистрация: 21.01.2016
Сообщений: 14,952
Завершенные тесты: 2
12.02.2018, 14:54 16
Leslov, какой пример? Записи несуществующего идентификатора?)

Цитата Сообщение от Leslov Посмотреть сообщение
более изящного решения не нашел.
Изящное решение простое: записывать данные, когда все зависимости в базе уже существуют.
0
Leslov
3 / 3 / 0
Регистрация: 13.10.2016
Сообщений: 48
Завершенные тесты: 1
12.02.2018, 15:35 17
Usaga, хорошо. Приведу пример.
Дано:
Список документов с сервера (в виде xml), каждый из которых содержит в себе идентификатор организации (по этому идентификатору можно отдельно запросить данные).
Пустая база данных
Снятое ограничение для внешнего ключа.
Необходимо:
Сохранить в базу все полученные документы и данные об организации в двух таблицах
Решение:
Полученный xml парсим в соответствующую модель и сохраняем в базу данных. Ссылки на существующие организации будут проставлены автоматически, если в соответствующей таблице будет найдена запись с необходимым идентификатором. Далее, составляем список идентификаторов организаций отсутствующих в базе и запрашиваем их поочередно с сервера, после чего сохраняем в базу данных.

Что бы вы изменили в этом примере?
0
Usaga
Эксперт .NET
5547 / 3750 / 663
Регистрация: 21.01.2016
Сообщений: 14,952
Завершенные тесты: 2
12.02.2018, 15:43 18
Цитата Сообщение от Leslov Посмотреть сообщение
Что бы вы изменили в этом примере?
Я бы восстанавливал весь граф зависимостей ДО сохранения в базу, раз есть такая техническая возможность. Т.е. лез бы в базу, смотрел наличие в ней необходимых зависимостей и, в случае наличия, сохранял бы или запрашивал недостающее, сохранял, а потом уже заносил остальное. Т.е. в любой момент в базе были бы корректные данные.
0
Leslov
3 / 3 / 0
Регистрация: 13.10.2016
Сообщений: 48
Завершенные тесты: 1
12.02.2018, 15:48 19
А как быть в случае если будут проблемы с сервером, например отсутствие ответа на запрос? Не сохранять документ без организации и выводить пользователю частичные данные? Тем более если это будет случай, когда отсутствие данных об организации менее критично, чем отсутствие какого-либо документа в базе.
0
Usaga
Эксперт .NET
5547 / 3750 / 663
Регистрация: 21.01.2016
Сообщений: 14,952
Завершенные тесты: 2
12.02.2018, 15:50 20
Цитата Сообщение от Leslov Посмотреть сообщение
А как быть в случае если будут проблемы с сервером, например отсутствие ответа на запрос
Тогда данные сохранять нельзя, ибо они неполные и тупо повреждённые. За вами выбор: информировать пользователя или молча повредить данные и в базе.
0
12.02.2018, 15:50
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.02.2018, 15:50

foreign key (C#+SQL)
Здравствуйте. Ситуация такая. Два формы. Form1 и Form2. С Form1 данные заполняют таблицу Table1....

Добавить данные в таблицу с Foreign Key
Проблема в следующем, не могу понять, как добавлять данные в таблицу в которой есть Foreign key. В...

Как заполнить колонку listview по foreign key?
Интересует способ выводить название отдела (departments.name) по foreign key (DepartmentsId)...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru