如何在此GridView中删除具有其培训记录的员工?

时间:2012-07-10 06:28:15

标签: c# asp.net gridview sql-server-2008-r2

我是一名新的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表中删除员工,并在所有其他表中包含他的所有信息。

4 个答案:

答案 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数据。

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