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

Ошибка при INSERT: "Cannot add or update a child row: a foreign key constraint fails"

09.05.2014, 22:54. Просмотров 1236. Ответов 12
Метки нет (Все метки)

Здравствуйте.
Задача- есть несколько дата грид вьюшек. в них отображаются данные разных таблиц одной бд. я выбираю в одной таблице людей, в другой выбираю организацию, в которую хочу их зачислить, в третьей выбираю должность, на которую зачисляю. есть еще временной промежуток, на протяжении которого они будут там принимать участие.
Делается все это кодом, за который прошу громко не ругаться, лучше ногами пинайте))) :
(DBConn.dbcon.conn - возвращает private static MySqlConnection con = new MySqlConnection(mysqlcon.ConnectionString);
DBConn.dbcon.comm - возвращает private static MySqlCommand cm = new MySqlCommand()
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
private void button1_Click(object sender, EventArgs e)
        {
            DateTime indate = DateTime.Parse(Convert.ToString(DateTime.Today));
            DateTime outdate = DateTime.Parse(Convert.ToString(DateTime.Today.AddYears(5))); ;
 
            DBConn.dbcon.conn.Open();
 
            DBConn.dbcon.comm.CommandText = @"INSERT INTO participation(member_id, comission_id, in_time, out_time, role)
values(@mem_id, @comission_id, @indate, @outdate, @role)";
 
            DBConn.dbcon.comm.Parameters.AddWithValue("@indate", indate);
            DBConn.dbcon.comm.Parameters.AddWithValue("@outdate", outdate);
             
            if (!(dataGridView2.SelectedRows.Count > 0)) MessageBox.Show("Не выбрано ни одной комиссии");
            else
            {
                DBConn.dbcon.comm.Parameters.AddWithValue("@comission_id",dataGridView1.SelectedRows[0].Cells[0].Value);
            }
 
            if (!(dataGridView3.SelectedRows.Count > 0)) MessageBox.Show("Не выбрано ни одной должности");
            else
            {                
                DBConn.dbcon.comm.Parameters.AddWithValue("@role", dataGridView1.SelectedRows[0].Cells[0].Value);             
            }
 
            if (!(dataGridView1.SelectedRows.Count > 0)) MessageBox.Show("Не выбрано ни одного участника");
            else
            {
                for (int i = 0; i < dataGridView1.SelectedRows.Count; i++ )
                {
                    DBConn.dbcon.comm.Parameters.AddWithValue("@mem_id", dataGridView1.SelectedRows[i].Cells[0].Value);
                    DBConn.dbcon.comm.ExecuteNonQuery(); //*
                }
            }
            DBConn.dbcon.conn.Close();
        }
При тыке на кнопку выдает такую ошибку в строчке помеченной звездочкой после комментария:
Cannot add or update a child row: a foreign key constraint fails (`gover`.`participation`, CONSTRAINT `participation_ibfk_2` FOREIGN KEY (`comission_id`) REFERENCES `comission` (`comission_id`))
(субд денвера)
При том, что прямой инсерт запрос в субд выполняется нормально.... а тут на ключи ругается. поудалял и перекидал ключи-не помогает. В чем может быть проблема?

Добавлено через 3 минуты
кстати я был бы благодарен за критику с пояснениями)
хочется не просто научиться писать код, а делать это нормально..
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2014, 22:54
Ответы с готовыми решениями:

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

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

Ошибка "Violation of primary key constraint" при update
Написал программку. При нажатии на кнопку &quot;обновить&quot; должна происходить синхронизация между базой...

При добавлении записи в БД происходит ошибка "violation of PRIMARY KEY constraint)"
Ребята, тут такая неразбериха, я по идее правильные ввожу данные, но почему то выскакивает данная...

При попытке заполнения таблиц через сторонний менеджер баз выскакивает ошибка "foreign key mismatch"
private const string path = @&quot;C:\klient.db3&quot;; private static SQLiteConnection connect =...

12
nmcf
6525 / 5749 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
09.05.2014, 23:12 2
Схему данных покажи. Так ничего не ясно.
0
user20011993
13 / 13 / 1
Регистрация: 19.10.2012
Сообщений: 539
09.05.2014, 23:54  [ТС] 3
модель базы
0
Миниатюры
Ошибка при INSERT: "Cannot add or update a child row: a foreign key constraint fails"  
user20011993
13 / 13 / 1
Регистрация: 19.10.2012
Сообщений: 539
10.05.2014, 11:15  [ТС] 4
когда убрал ключи с таблицы, в которую делаю INSERT- стало работать. но как без ключей-то....

Добавлено через 9 минут
а еще такая проблема возникла-делаю обновление DVG, которые есть на формах(изменил таблицу-обновил DGV). Этот код у меня в отдельном классе. вопрос-как из пользовательского класса получить доступ к DGV, которые лежат на форме

Добавлено через 5 минут
в этом классе я сделал экземпляр той формы с DGV,
C#
1
public static StartForm form = new StartForm();
и делаю изменения в этом экземпляре
C#
1
2
            System.Windows.Forms.DataGridView memdgv = form.memdgv();
            memdgv.DataSource = dt;
вот тут я затупил. долго думал как обратиться к элементам формы из другого класса. думал что если сделать экземпляр формы и так получать доступ к ее элементам то будет работать как хочу-ага, щаЗЗззз.
Можно ли от этого потомка обратиться к родителю чтобы передать изменения?
0
nmcf
6525 / 5749 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
10.05.2014, 13:18 5
Во-первых не вижу, где ты задаёшь ключ таблицы participation (ID) при добавлении записи. Во-вторых почему у тебя все внешние ключи заполняются из одной и той же нулевой ячейки DataGridView? Наверное, дело в том, что значения внешних ключей, которые ты пытаешься установить не соответствуют реальным ID связанных таблиц. Отсюда и ошибка.

Добавлено через 5 минут
Для обращения из основной формы к элементам вспомогательной достаточно объявить их public. Обращение из вспомогательной формы к данным основной аналогично - через public-параметр. После создания второй формы, но перед открытием, присваиваешь этому параметру то, что нужно, потом внутри второй формы это будет доступно.
1
user20011993
13 / 13 / 1
Регистрация: 19.10.2012
Сообщений: 539
10.05.2014, 13:34  [ТС] 6
nmcf, поля id в базе самоувеличиваются. а взятие id иконкретной ячейки таблицы ориентировано на то, что ид действительно будет именно там, что надо сейчас проверить

Добавлено через 13 минут
nmcf, я сначала не понял "внешние ключи заполняются из одной и той же нулевой ячейки". потом дошло-они все брались из одной и той же ячейки одной и той же DGV, которая хранит людей. и бралось id выбранного человека.

Добавлено через 43 секунды
верну ключи на место и посмотрю заработает ли
0
nmcf
6525 / 5749 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
10.05.2014, 13:37 7
Самоучвеличиваются? Это особенность MySQL или у тебя там какой-то триггер стоит?

Добавлено через 1 минуту
Минус такого самоувеличения в том, что твой набор ничего не узнает о новом ID, придётся перечитывать DataTable или какую-то его часть.
0
user20011993
13 / 13 / 1
Регистрация: 19.10.2012
Сообщений: 539
10.05.2014, 14:11  [ТС] 8
nmcf, не триггер. можно задать полю свойство auto_increment. сама субд это умеет. понимаю что триггеры, или в приложении определять следующий id лучше, но нет времени на серьезную проработку. надо лабу сдать)

Добавлено через 25 минут
начал возиться с поиском по базе из приложения. нужно выполнить подобный запрос
SQL
1
2
3
4
5
6
SELECT `id`,`name`,`surname`,`patronymic`
FROM `member`
WHERE `id` = 
(SELECT `id`
FROM `participation`
WHERE `comission_id` = выбранный id)
если запихать такое в querystring, то выполнится ли это корректно? или надо разбивать на более мелкие операции?
0
nmcf
6525 / 5749 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
10.05.2014, 15:00 9
Должен выполниться. Зависит от поддержки вложенных запросов самой СУБД.

Добавлено через 6 минут
Хотя не ясно, что ты так хочешь выбрать. У тебя ID разных таблиц совпадают, что ли?
1
user20011993
13 / 13 / 1
Регистрация: 19.10.2012
Сообщений: 539
10.05.2014, 20:24  [ТС] 10
nmcf, в таблице participation хранятся id записи(т.е. строки в таблице), id человека, id должности, id комиссии, время приема на работу и время увольнения. я имел ввиду что селект из вложенного запроса вернет id человека, у которого есть id заданной комиссии или должности. этим запросом я планирую искать полный состав какой-то комиссии, либо полный список всех, к примеру, председателей.(не знаю понятно ли я мыслю свою излагаю)

Добавлено через 4 часа 47 минут
nmcf, с поиском разделался. осталось только обновление DataGridView'шек.
это код моего класса с обновлением содержимого DataGridView.
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using MySql.Data.MySqlClient;
 
namespace City_Government
{
    class DGVFill
    {
        public static DGVFill ex;
        public static StartForm form = new StartForm(); //это, как мне думается, копия моей формы, к содержимому 
                                                                         //которой я тяну руки
        static DGVFill()                                             
        {
            ex = new DGVFill();
        }
 
        private DGVFill()
        {
        }
 
        public static DGVFill fill
        {
            get { return ex; }
        }
 
        public static void MemberDGVFill()
        {
            System.Data.DataTable dt = new System.Data.DataTable();
 
            string querystring = @"select surname as 'Фамилия', name as 'Имя', patronymic as 'Отчество', 
date_format(borndate, '%d.%m.%Y' ) as 'Дата рождения', h_phone as 'Телефон', address as 'Адрес' from member";
 
            DBConn.dbcon.conn.Open();
 
            DBConn.dbcon.comm.CommandText = querystring;
            DBConn.dbcon.comm.Connection = DBConn.dbcon.conn;
 
            using (MySqlDataReader dr = DBConn.dbcon.comm.ExecuteReader())
            {
                if (dr.HasRows) dt.Load(dr);
 
            }
            
            System.Windows.Forms.DataGridView memdgv = form.memdgv();
            memdgv.DataSource = dt; //к примеру тут я обновляю содержимое компонента формы, но это ведь только
                                                // копия. на оригинале ни как не отражаются изменения.
            DBConn.dbcon.ConnClose();
        }
 
        public static void RoleDGVFill()
        {
            System.Data.DataTable dt2 = new System.Data.DataTable();
 
            System.Windows.Forms.DataGridView comdgv = form.roledgv();
 
            DBConn.dbcon.conn.Open();
 
            DBConn.dbcon.comm.Connection = DBConn.dbcon.conn;
 
            string querystring1 = @"select role_id as 'ID', role as 'Должность' from role";
 
            DBConn.dbcon.comm.CommandText = querystring1;
 
            using (MySqlDataReader dr2 = DBConn.dbcon.comm.ExecuteReader())
            {
                if (dr2.HasRows) dt2.Load(dr2);
            }
 
            comdgv.DataSource = dt2;
 
            DBConn.dbcon.conn.Close();
        }
 
        public static void ComissionDGVFill()
        {
            System.Data.DataTable dt1 = new System.Data.DataTable();
                        
            System.Windows.Forms.DataGridView comdgv = form.comdgv();
            
            DBConn.dbcon.conn.Open();
 
            DBConn.dbcon.comm.Connection = DBConn.dbcon.conn;
 
            string querystring1 = @"select comission_id as 'Номер камиссии', spec as 'Специализация' from comission";
 
            DBConn.dbcon.comm.CommandText = querystring1;
 
            using (MySqlDataReader dr1 = DBConn.dbcon.comm.ExecuteReader())
            {
                if (dr1.HasRows) dt1.Load(dr1);
            }
 
            comdgv.DataSource = dt1;
 
            DBConn.dbcon.conn.Close();
        }
    }
}
Нашел на форуме такой способ:
-------------------------------------------------------------
При создании второй формы устанавливаем владельца
C#
1
2
3
Form2 f = new Form2();
f.Owner = this;
f.ShowDialog();
Во второй форме определяем владельца
C#
1
2
3
4
5
6
Form1 main = this.Owner as Form1;
if(main != null)
{
    string s = main.textBox1.Text;
    main.textBox1.Text = "OK";
}
-------------------------------------------------------------
А вот как им пользоваться не пойму. Куда в моем случае пихать код определения владельца?
0
nmcf
6525 / 5749 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
10.05.2014, 21:52 11
Из твоего запроса получается, что member.id = participation.id, вот я и спрашиваю, почему так.

Добавлено через 2 минуты
Код определения используй там, где тебе нужно обращаться к полям владельца.
0
user20011993
13 / 13 / 1
Регистрация: 19.10.2012
Сообщений: 539
10.05.2014, 23:26  [ТС] 12
nmcf, т.е. если у меня есть 5 методов где я обращаюсь, то в каждом мне надо определять владельца? а создавать форму можно статичеки?
0
nmcf
6525 / 5749 / 2621
Регистрация: 14.04.2014
Сообщений: 24,493
11.05.2014, 07:36 13
Создание формы делаешь 1 раз, а потом ShowDialog() в нужных местах. Естественно, в заголовке класса надо описать переменную для формы.
0
11.05.2014, 07:36
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.05.2014, 07:36

Ошибка при Update "Update requires a valid InsertCommand when passed DataRow collection with new rows"
Доброго времени суток! Я в этом всем новичек и поэтому совсем не могу понять в чем ошибка. В...

mssql 2012, foreign key constraint внутри таблицы
Конструкция типа дерева tagParentId ссылается на tagId. А каскадное удаление записей...

Ошибка при записи в бд из текст боксов "Ошибка синтаксиса в инструкции INSERT INTO"
Пытаюсь добавить в базу информацию из разных Текст боксов... Но почему то получаю...


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

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

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