我是一名新的ASP.NET开发人员,并尝试使用GridView控件显示数据库中employee表中的所有员工。我现在正在删除GridView中任何员工的全部信息。我面临以下问题,我不知道为什么:
仅供参考,我有以下数据库设计:
Employee Table: Username, Name, JobTitle, BadgeNo, IsActive, DivisionCode
Divisions Table: SapCode, DivisionShortcut
Groups Table: GroupID, GroupName
Courses Table: CourseID, CourseName, GroupID
Employee_Courses Table: EmployeeID, CourseID
(IsActive就像一个标志(位数据类型)来指示员工是否在某项作业中)
现在,我希望管理员能够删除员工,并删除Employee_Courses表中存在的所有培训信息。 怎么做?
我的删除查询:
DELETE employee where dbo.employee.Username = @Username
删除记录的代码隐藏如下:
protected void DeleteRecord(object sender, GridViewDeleteEventArgs e)
{
string networkID = GridView1.DataKeys[e.RowIndex].Value.ToString();
string connString = ConfigurationManager.ConnectionStrings["UsersInfoDBConnectionString"].ConnectionString;
SqlConnection conn = new SqlConnection(connString);
string deleteCommand = "DELETE employee where dbo.employee.Username = " + networkID;
SqlCommand cmd = new SqlCommand(deleteCommand, conn);
cmd.Parameters.AddWithValue("@username", networkID);
try
{
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}
catch (SqlException se)
{
throw se;
}
finally
{
cmd.Dispose();
conn.Close();
conn.Dispose();
}
GridView1.DataBind();
}
对于没有培训记录的员工来说,它很有效,但对于任何有培训记录的员工都不适用,并且它给我以下错误:
DELETE语句与REFERENCE约束冲突 “FK_employee_courses_employee”。冲突发生在数据库中 “UsersInfoDB”,表“dbo.employee_courses”,列“employeeId”。该 声明已被终止。
那么如何解决这个问题?
更新
仅供参考,Username是Employee Table中的主键,EmployeeID是该主键的外键。那么如何从Employee表中删除员工,并在所有其他表中包含他的所有信息。
答案 0 :(得分:1)
您的删除查询中存在一个错误,即您缺少表名Employee_Courses 你的查询应该是这个
DELETE employee from Employee_Courses where dbo.employee.Username = @Username
错误的发生是因为您有外键关系。首先从子表中删除数据,然后从父表中删除它。 UsersInfoDB与Employee_Courses表有关系,首先从UsersInfoDB中删除记录,然后SQL SErver将允许您从父表中删除记录。
可能的解决方案。 转到桌面设计,右键单击表格,将出现一个菜单,选择关系,将打开名为外键关系的弹出窗口,从左侧选择所需的键窗格,然后从右侧选择更新和删除规范并指定删除规则。对于DELETE,您应将其设置为CASCADE。设置删除规则后,您不需要手动从子表中删除记录,现在您的代码将起作用,每当您从Employee_Courses表中删除记录时,它也将自动从子表(UserInfoDB)中删除。
答案 1 :(得分:0)
首先删除employee_courses_employee中的元素,其中EmployeeID =您要删除的员工。删除所有记录后,您将不再获得引用约束。
首先执行,然后执行下一个(您当前正在尝试执行的查询,我相信它只是访问employee表)
编辑:我相信员工表中似乎没有EmployeeID记录 - 但应该有(它是主键吗?)。如果有一些员工ID存储与用户名或员工表中的其他数据相关,那么您一定要先获取员工的ID,删除所有记录,然后从员工表中删除该员工。 。
"参考"约束指的是被称为"外键"它将一个表中的数据链接到另一个表中的数据。如果"主键"被删除," foriegn Key"不存在,并且链接它们的连接是垃圾,这就是为什么在删除具有主键(EmployeeID)的数据之前必须先处理关系的原因
答案 2 :(得分:0)
让DeleteCommand
调用存储过程。删除所有引用表。
如果表具有外键约束,则需要首先删除引用表中的条目。只有这样才能删除主记录。
在这种情况下,请致电
DELETE employee from Employee_Courses where dbo.employee.Username = @Username
之前
DELETE employee where dbo.employee.Username = @Username
答案 3 :(得分:0)
首先从Employee_Courses表中删除数据,然后
来自员工表的。但是你在Employee表中有任何EmployeeID / ID列吗?我的意思是
您在哪里获得Employee_Courses表的EmployeeID数据。
您已从两个表中删除数据,而不是仅从一个表中删除它。