C# - 无法添加或更新子行:外键约束失败
Posted
技术标签:
【中文标题】C# - 无法添加或更新子行:外键约束失败【英文标题】:C# - Cannot add or update a child row: a foreign key constraint fails 【发布时间】:2021-07-17 13:45:18 【问题描述】:我知道有很多关于这个问题的问题,但我无法解决它。 我正在做一个图形界面来添加/删除员工和管理缺勤。
我一直在阅读和测试这些建议***1,但我无法更改数据库,因为它已经由我们的教授给出。
外键的值已经在我在代码中称为“部门”的表“服务”中。
我有以下数据库(对于我遇到问题的表):
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;
在应用程序中,您可以看到here,在下图中,我必须修改员工数据并将其再次保存到 dataGridView。
点击保存后出现问题。我的请求有错误,但我不知道如何解决。无法添加或更新子行:外键约束失败(gestionpersonnel
.personnel
,CONSTRAINT personnel_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:
对于字符串变量中的请求,我一直在数据库和 C# 中的代码之间遵循相同的顺序。
更新2(回复@Sharath N S),通过使用一步一步,我可以从部门得到一个值
更新 3(回复@Crowcoder):确实是@Sharath N S 给我的相同评论。我感觉我得到的是部门的字段而不是 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();
【问题讨论】:
mysql 参数是位置的,不是命名的。尝试按照它们在 SQL 语句中的顺序排列它们。不过,我看不到运行查询的代码的实现,所以我不能确定这是问题所在。 感谢您的反馈@Crowcoder。我已经用这张表的 phpMyAdmin 图片更新了我的消息。在我的请求中,我一直遵循相同的列名称顺序。 确实你是对的@Crowcoder idservice 的顺序不一样,但这仍然不起作用 当你说它不起作用时,你是说它是同样的问题吗?还有,调试的时候employee.IdDepartment
的值是多少,这个id在service表中是否存在?
您不想要组合框的选定索引,它几乎肯定不会匹配记录的真实ID。您想要所选项目的值。
【参考方案1】:
请检查更新员工详细信息时发送的 IDservice 的值。从错误看来,父表服务中不存在正在更新的 IdService 值。
【讨论】:
你好@sharanth N S,我可以得到一个值,但我确实有部门名称的字段,而我应该得到 idDepartment 编号 我没有找到问题以上是关于C# - 无法添加或更新子行:外键约束失败的主要内容,如果未能解决你的问题,请参考以下文章
外键 Laravel 8 foreignId + 约束 - 无法添加或更新子行:外键约束失败
MySql 重启后:#1452 - 无法添加或更新子行:外键约束失败