提问者:小点点

C#-无法添加或更新子行:外键约束失败


我知道在这个问题上有很多问题,但我一直未能解决。我正在做一个图形界面来添加/删除员工和管理缺勤。

我一直在阅读和测试那些建议stackOverflow1,但我不能更改数据库,因为它已经由我们的教授给出了。

来自外键的值已经在表“service”中,我在代码中称之为“department”。

我有以下数据库(对于我得到问题的表):

DROP TABLE IF EXISTS personnel;
CREATE TABLE personnel (
  IDPERSONNEL int NOT NULL,
  IDSERVICE int NOT NULL,
  NOM varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  PRENOM varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL,
  TEL varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL,
  MAIL varchar(128) COLLATE utf8_unicode_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

DROP TABLE IF EXISTS service;
CREATE TABLE service (
  IDSERVICE int NOT NULL,
  NOM varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

在应用程序中,您可以看到这里和下面的图片,我必须修改员工数据,并将其再次保存到DataGridView。

我有一个问题,一旦我点击保存。请求出错,但不知道如何解决。
无法添加或更新子行:外键约束失败(GestionPersonPerson,constraintPersonnel_IBFK_1外键(IDService)引用Service(IDService))

下面是我在AccessDatabase类中使用的方法:

  public static void UpdateEmployee(Employee employee)
        {
            string req = "update personnel set nom = @nom, prenom = @prenom, tel = @tel, mail = @mail, idservice = @idservice ";
            req += "where idpersonnel = @idpersonnel;";
            Dictionary<string, object> parameters = new Dictionary<string, object>
            {
                {"@idpersonnel", employee.IdEmployee },
                {"@idservice", employee.IdDepartment },
                {"@nom", employee.FamilyName },
                {"@prenom", employee.FirstName },
                {"@tel", employee.Phone },
                {"@mail", employee.Mail }
            };
            ConnexionDataBase connexion = ConnexionDataBase.GetInstance(connexionString);
            connexion.ReqUpdate(req, parameters);
        }

更新1:

更新3(回复@crowcoder):这确实是@sharath给我的同样的评论。我有一种感觉,我得到的是部门的字段,而不是IDDepartment。

这里是保存按钮的代码:

 private void BtnSaveEmployee_Click(object sender, EventArgs e)
        {
            if (String.IsNullOrEmpty(textBoxFamilyName.Text) ||
                String.IsNullOrEmpty(textBoxFirstName.Text) ||
                String.IsNullOrEmpty(textBoxPhone.Text) ||
                String.IsNullOrEmpty(textBoxMail.Text))
            {
                MessageBox.Show("All the informations shall be filled", "Information");
            }
            else
            
            {
                Department department = (Department)bindingSourceDepartments.List[bindingSourceDepartments.Position];
                int idEmployee = 0;
                if (modificationOngoing)
                {
                    idEmployee = (int)dataGridViewEmployee.SelectedRows[0].Cells["idEmployee"].Value;
                }
                Employee employee = new Employee(idEmployee,
                                                 textBoxFamilyName.Text,
                                                 textBoxFirstName.Text,
                                                 textBoxPhone.Text,
                                                 textBoxMail.Text,
                                                 department.IdDepartment,
                                                 department.DepartmentName);

                if (modificationOngoing)
                {
                    controlMyApp.UpdateEmployee(employee);
                    modificationOngoing = false;
                    grpBoxEmployee.Enabled = true;
                    lblShowButtonClicked.Text = "Adding";
                }
                else
                {
                    controlMyApp.AddEmployee(employee);
                }
                FillEmployeesList();
                EmptyEmployeeSelection();
            }
        }


共1个答案

匿名用户

请检查更新员工详细信息时发送的IDservice的值。从错误来看,正在更新的IdService值似乎不存在于父表服务中。