2

私は新しい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テーブルの主キーであり、EmployeeIDはその主キーの外部キーです。では、他のすべてのテーブルにあるすべての情報とともに、Employeeテーブルから従業員を削除するにはどうすればよいですか。

4

4 に答える 4

1

1つの間違いは、削除クエリにあります。テーブル名Employee_Coursesがありません。クエリは次のようになります。

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

エラーは、外部キー関係があるために発生します。最初に子テーブルからデータを削除し、次に親テーブルからデータを削除します。UsersInfoDBはEmployee_Coursesテーブルと関係があり、最初にUsersInfoDBからレコードを削除します。次に、SQL SErverを使用すると、親テーブルからレコードを削除できます。

考えられる解決策。テーブルデザインに移動し、テーブルを右クリックすると、メニューが表示され、[関係]を選択しForeign Key RelationShipsという名前のポップアップウィンドウが開きます。左側のペインから目的のキーを選択し、右側から[仕様の更新と削除]を選択して指定します。削除ルール。DELETEの場合は、CASCADEに設定する必要があります。削除ルールを設定した後、子テーブルからレコードを手動で削除する必要はありません。これでコードが機能し、Employee_Coursesテーブルからレコードを削除するたびに、子テーブル(UserInfoDB)からも自動的に削除されます。

于 2012-07-10T06:30:23.923 に答える
0

まず、employee_courses_employeeの要素を削除します。ここで、EmployeeID=削除する従業員です。すべてのレコードを削除すると、参照制約は取得されなくなります。

最初にそれを実行し、次に次のクエリを実行します(現在実行しようとしているクエリはemployeeテーブルにアクセスしているだけだと思います)

編集:従業員テーブルに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 に答える
0

最初にEmployee_Coursesテーブルからデータを削除し、次に

従業員テーブルから。しかし、EmployeeテーブルにEmployeeID / ID列はありますか?私は

Employee_CoursesテーブルのEmployeeIDデータはどこで取得しますか。

1つのテーブルだけからデータを削除するのではなく、両方のテーブルからデータを削除します。

于 2012-07-10T06:41:40.490 に答える