Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在此GridView中删除具有培训记录的员工?_C#_Asp.net_Gridview_Sql Server 2008 R2 - Fatal编程技术网

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

C# 如何在此GridView中删除具有培训记录的员工?,c#,asp.net,gridview,sql-server-2008-r2,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: GroupI

我是一名新的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语句与引用约束冲突 “FK_员工_课程_员工”。数据库中发生冲突 “UsersInfoDB”,表“dbo.employee_课程”,列“employeeId”。这个 声明已终止

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

更新:


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

一个错误是在删除查询中,您缺少表名employee\u Courses 你的问题应该是这样的

从员工课程中删除员工,其中dbo.employee.Username=@Username

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

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

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

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

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


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

使您的
DeleteCommand
调用存储过程。没有删除所有引用表

如果表具有外键约束,则需要首先删除引用表中的条目。只有这样,它才允许您删除主记录

在这种情况下,请致电

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

DELETE employee where dbo.employee.Username = @Username

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

从Employee表中。但在Employee表中是否有EmployeeID/ID列??我是说从

您从何处获得EmployeeID数据以用于Employee_课程表


您必须同时从两个表中删除数据,而不是仅从一个表中删除数据。

您应该知道,您的代码容易受到SQL注入的攻击。您正在生成查询,您正在传递一个@UserName参数employeeid,它是UserInfoDB?中employee表的foreignkey,也可以看到我的答案,我在这里解释了如何指定删除规则。指定删除规则后,数据将自动从子表中删除。是的,用户名是Employee表中的主键,EmployeeID是该主键的外键。那么,我如何才能从employee表中删除该员工以及所有其他表中的所有信息。还有一个问题。这样做对设计本身没有危险吗?