如何从两个表中删除相关记录的内容?

时间:2011-12-11 04:39:07

标签: sql vb.net sql-server-2008

StudentDetails.Students是与RegistrationDetails.Registration形成关系的主表。因此,StudentID是前者的主键,而后者则是外键。

现在我已经尝试了以下每个代码,但前两个代码中的每一个都给出了错误消息“'a'附近的语法不正确”,而在第三个DbTransaction的情况下,如“Dim trans As” DbTransaction“也不是有效类型。我正在使用SQL Server 2008专业版。

1

cmd = New SqlCommand("DELETE FROM StudentDetails.Students a, RegistrationDetails.Registration b WHERE (b.StudentId=a.StudentId) AND a.StudentId='" & txtStudentID.Text & "'", cn)

2

cmd = New SqlCommand("DELETE FROM StudentDetails.Students a, RegistrationDetails.Registration b WHERE (b.StudentId=a.StudentId) AND a.StudentId='/" & txtStudentID.Text & "/'", cn)

4 个答案:

答案 0 :(得分:3)

删除时不要指定字段,一次从1个表中删除,并在事务中包装所有内容:

Dim trans As SqlTransaction

trans = cn.BeginTransaction

Try
  Dim cmd1 As New SqlCommand("Delete from Registration where StudentId='" & txtStudentID.Text & "'", cn)

  cmd1.ExecuteNonQuery()

  Dim cmd2 As New SqlCommand("Delete from StudentDetails where StudentId='" & txtStudentID.Text & "'", cn)

  cmd2.ExecuteNonQuery()

  trans.Commit()
Catch theException As Exception
  ' Report the exception
  trans.Rollback()
End Try

答案 1 :(得分:2)

我真的不知道任何与.NET相关的东西,但你应该尝试类似的东西:

cmd = New SqlCommand("Delete from StudentDetails.Students a, RegistrationDetails.Registration b where (b.StudentId=a.StudentId) and a.StudentId='" & txtStudentID.Text & "'", cn)

因为您删除了整个记录而不是列,这就是为什么不删除,也不能在DELETE子句中指定列名

答案 2 :(得分:1)

首先删除与“指定的StudentId”相关的“注册”表中的所有记录。

然后,从主表“StudentDetails”中删除它。

为了保持数据的一致性,请使用事务。

答案 3 :(得分:0)

通常最好使用事务,尤其是在从两个表中删除相关数据时。使用参数化而不是连接,并阅读有关SQL injection的更多信息。

您的代码应该更像这样:

Using c As New SqlConnection("connection string")
    c.Open()
    Using tx As SqlTransaction = c.BeginTransaction()
        Try
            Using cmd As SqlCommand = c.CreateCommand()
                cmd.CommandText = "delete from RegistrationDetails.Registration where StudentId = @studentId"
                cmd.Parameters.Add("@studentId", SqlDbType.VarChar).Value = txtStudentID.Text
                cmd.ExecuteNonQuery()

                cmd.CommandText = "delete from StudentDetails.Students where StudentId = @studentId"
                cmd.Parameters.Add("@studentId", SqlDbType.VarChar).Value = txtStudentID.Text
                cmd.ExecuteNonQuery()

                tx.Commit()
            End Using
        Catch generatedExceptionName As Exception
            tx.Rollback()
            ' take care of exception here
            Throw
        End Try
    End Using
End Using

我认为StudentId列是varchar类型(因为在a.StudentId='" & txtStudentID.Text & "'"中使用了撇号),如果它没有将SqlDbType.VarChar更改为它是什么。