0

各教科 (英語、数学など) ごとにテーブルが作成され、学生テーブルは各教科テーブルに関連付けられています。誰かが親切に以下のコードを編集して、削除コマンドを実行して、これらの複数のテーブルから記録します。

重要な問題の 1 つは、削除コマンドを実行して、新しいサブジェクトが導入されたときに後で作成される追加のサブジェクト テーブルから関連するレコードを削除できるようにする方法があることです。

Dim cd As String

If txtName.Text = "" And cboDay.Text = "" And cboMonth.Text = "" And txtYear.Text = "" And lblAge.Text = "" And radioMale.Checked = False Or RadioFemale.Checked = False And txtGName.Text = "" And txtMPhone.Text = "" And txtEmail.Text = "" And txtAddress.Text = "" And txtCity.Text = "" And cboRegion.Text = "" And PictureBox1.ImageLocation = "" Then
    MessageBox.Show("There is no record selected to delete. Search for the record to delete.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
Else
    cd = MessageBox.Show("You are about to delete this record. Are you sure you want to delete?", "Confirm Delete", MessageBoxButtons.YesNo, MessageBoxIcon.Question)
    If cd = vbYes Then
        cmd = New SqlCommand("Delete from StudentDetails.Registration where StudentId='" & txtStudentId.Text & "'", cn)
        cmd.ExecuteNonQuery()

        cmd = New SqlCommand("Delete from StudentDetails.Students where StudentId='" & txtStudentId.Text & "'", cn)
        cmd.ExecuteNonQuery()

        cmd = New SqlCommand("Delete from ProgramDetails.EnglishLanguage where StudentId='" & txtStudentId.Text & "'", cn)
        cmd.ExecuteNonQuery()

        MessageBox.Show("Record deleted", "Deleted", MessageBoxButtons.OK, MessageBoxIcon.Information)
        Showgrid()
        txtStudentId.Clear()
        txtName.Clear()
        cboDay.Text = ""
        cboMonth.Text = ""
        lblAge.Text = ""
        txtNationality.Clear()
        If radioMale.Checked = True Then
            Sex = ""
        End If
        cboStudentType.Text = ""
        cboHouse.Text = ""
        cboRoom.Text = ""
        txtGName.Clear()
        txtMPhone.Clear()
        txtHPhone.Clear()
        txtEmail.Clear()
        txtAddress.Clear()
        txtCity.Clear()
        cboRegion.Text = ""
        PictureBox1.Image = PictureBox1.ErrorImage
        txtStudentId.Focus()
    End If
End If
4

1 に答える 1

1

DELETECASCADEを試してみませんか。コードで手動で行うよりも優れています。

カスケード参照整合性制約を使用することにより、ユーザーが既存の外部キーが指すキーを削除または更新しようとしたときにSQLServerが実行するアクションを定義できます。

ON DELETE CASCADE 他のテーブルの既存の行にある外部キーによって参照されるキーを持つ行を削除しようとすると、それらの外部キーを含むすべての行も削除されることを指定します。

提供したコードの場合、コマンドは次のようになります。

cmd = New SqlCommand("Delete from StudentDetails.Registration where StudentId=" & Integer.Parse(txtStudentId.Text), cn)

SQLインジェクションを回避するには、パラメーター化されたクエリを使用する必要があります。

cmd = New SqlCommand("Delete from StudentDetails.Registration where StudentId = @StudentId" , cn)
cmd.Parameters.AddWithValue("@StudentId", Integer.Parse(txtStudentId.Text))
于 2013-02-14T10:15:02.103 に答える