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

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

09.05.2014, 22:54. Просмотров 1614. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
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...

Ошибка "Cannot add or update a child row: a foreign key constraint fails"
Здравствуйте. Столкнулась со следующей ошибкой Cannot add or update a child row: a foreign key...

Ошибка MySQL: "Cannot add or update a child row: a foreign key constraint fails"
Доброе время суток!! Пытаюсь сделать такой запрос: ALTER TABLE `positions` ADD FOREIGN...

12
6822 / 5962 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
09.05.2014, 23:12 2
Схему данных покажи. Так ничего не ясно.
0
13 / 13 / 1
Регистрация: 19.10.2012
Сообщений: 545
09.05.2014, 23:54  [ТС] 3
модель базы
0
Миниатюры
Ошибка при INSERT: "Cannot add or update a child row: a foreign key constraint fails"  
13 / 13 / 1
Регистрация: 19.10.2012
Сообщений: 545
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
6822 / 5962 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
10.05.2014, 13:18 5
Во-первых не вижу, где ты задаёшь ключ таблицы participation (ID) при добавлении записи. Во-вторых почему у тебя все внешние ключи заполняются из одной и той же нулевой ячейки DataGridView? Наверное, дело в том, что значения внешних ключей, которые ты пытаешься установить не соответствуют реальным ID связанных таблиц. Отсюда и ошибка.

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

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

Добавлено через 43 секунды
верну ключи на место и посмотрю заработает ли
0
6822 / 5962 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
10.05.2014, 13:37 7
Самоучвеличиваются? Это особенность MySQL или у тебя там какой-то триггер стоит?

Добавлено через 1 минуту
Минус такого самоувеличения в том, что твой набор ничего не узнает о новом ID, придётся перечитывать DataTable или какую-то его часть.
0
13 / 13 / 1
Регистрация: 19.10.2012
Сообщений: 545
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
6822 / 5962 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
10.05.2014, 15:00 9
Должен выполниться. Зависит от поддержки вложенных запросов самой СУБД.

Добавлено через 6 минут
Хотя не ясно, что ты так хочешь выбрать. У тебя ID разных таблиц совпадают, что ли?
1
13 / 13 / 1
Регистрация: 19.10.2012
Сообщений: 545
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
6822 / 5962 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
10.05.2014, 21:52 11
Из твоего запроса получается, что member.id = participation.id, вот я и спрашиваю, почему так.

Добавлено через 2 минуты
Код определения используй там, где тебе нужно обращаться к полям владельца.
0
13 / 13 / 1
Регистрация: 19.10.2012
Сообщений: 545
10.05.2014, 23:26  [ТС] 12
nmcf, т.е. если у меня есть 5 методов где я обращаюсь, то в каждом мне надо определять владельца? а создавать форму можно статичеки?
0
6822 / 5962 / 2709
Регистрация: 14.04.2014
Сообщений: 25,504
11.05.2014, 07:36 13
Создание формы делаешь 1 раз, а потом ShowDialog() в нужных местах. Естественно, в заголовке класса надо описать переменную для формы.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.05.2014, 07:36

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Cannot add or update a child row: a foreign key constraint fails
Всем привет. Буду рад помощи. Столкнулся с ошибкой. 123Cannot add or update a child row: a...

Cannot add or update a child row: a foreign key constraint fails
Такая проблема: не добавляется значение в таблицу через запрос mysql_query. Если тоже самое делать...

Cannot add or update a child row: a foreign key constraint fails
Доброе время суток. Являюсь полнейшим профаном в MySql и в базах данных собственно тоже....

Cannot add or update a child row: a foreign key constraint fails
Вот код ошибки: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrity ConstraintViolationException:...


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

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

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