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)
答案 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
更改为它是什么。