2

我是一名新的 ASP.NET 开发人员,并尝试使用 GridView 控件来显示数据库中员工表中的所有员工。我现在正在删除 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”中。该语句已终止。

那么如何解决这个问题呢?

更新:

仅供参考,用户名是 Employee 表中的主键,而 EmployeeID 是该主键的外键。那么如何从 Employee 表中删除该员工以及他在所有其他表中的所有信息。

4

4 回答 4

1

一个错误是在您的删除查询中,您缺少表名 Employee_Courses 您的查询应该是这个

DELETE employee from Employee_Courses where dbo.employee.Username = @Username

出现错误是因为您有外键关系。先从子表中删除数据,再从父表中删除。UsersInfoDB 与Employee_Courses 表有关系,首先从UsersInfoDB 中删除记录,然后SQL SErver 将允许您从父表中删除记录。

可能的解决方案。转到您的表设计,右键单击表,将出现一个菜单选择关系,将打开一个名为外键关系的弹出窗口,从左侧窗格中选择所需的键,然后从右侧选择更新和删除规范并指定删除规则。对于 DELETE,您应该将其设置为 CASCADE。设置删除规则后,您不需要手动从子表中删除记录,现在您的代码将工作,每当您从 Employee_Courses 表中删除记录时,它也会自动从子表 (UserInfoDB) 中删除。

于 2012-07-10T06:30:23.923 回答
0

首先从 Employee_Courses 表中删除数据,然后

从员工表。但是您在 Employee 表中有任何 EmployeeID/ID 列吗?我的意思是从

您从哪里获得 Employee_Courses 表的 EmployeeID 数据。

您已从两个表中删除数据,而不是仅从一个表中删除数据。

于 2012-07-10T06:41:40.490 回答
0

首先删除employee_courses_employee 中的元素,其中EmployeeID = 您要删除的员工。删除所有记录后,您将不再获得引用约束。

首先执行,然后执行下一个(您当前尝试执行的查询我相信它只是访问员工表)

编辑:我相信您的员工表中似乎没有 EmployeeID 记录 - 但应该有(它是主键吗?)。如果有一些员工 ID 与用户名或员工表中的其他数据相关的存储,您肯定应该首先获取员工的 ID,删除他的所有记录,然后从员工表中删除员工。

“引用”约束是指称为“外键”的东西,它将一个表中的数据链接到另一个表中的数据。如果删除“主键”,则“外键”将不存在,链接它们的连接是垃圾,这就是为什么在删除具有主键(EmployeeID)的数据之前必须先处理关系的原因

于 2012-07-10T06:31:48.423 回答
0

使您的DeleteCommand调用成为存储过程。那里删除所有引用表。

如果表有外键约束,则需要先删除引用表中的条目。只有这样它才能让你删除主记录。

在这种情况下,调用

DELETE employee from Employee_Courses where dbo.employee.Username = @Username

DELETE employee where dbo.employee.Username = @Username
于 2012-07-10T06:33:28.140 回答