Как удалить содержимое связанной записи из двух таблиц? - PullRequest
1 голос
/ 11 декабря 2011

StudentDetails.Students - это главная таблица, которая образует связь с RegistrationDetails.Registration.Поэтому StudentID является первичным ключом в первом, тогда как во втором - внешним ключом.

Теперь я попробовал каждый из следующих кодов, но каждый из первых двух выдает сообщение об ошибке «Неверно».синтаксис рядом с 'a' 'и в случае третьего DbTransaction, как в «Dim trans As DbTransaction», также не является допустимым типом.Пожалуйста, я использую SQL Server 2008 Professional Edition.

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 ]

3 голосов
/ 11 декабря 2011

Не указывайте поля при удалении, удаляйте из 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
2 голосов
/ 11 декабря 2011

Я действительно не знаю ничего, связанного с .NET, но вы должны попробовать что-то вроде:

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

Поскольку вы удаляете целые записи, а не столбцы, вот почему вы не можете и не можете 'указывать имена столбцов в предложении DELETE

1 голос
/ 11 декабря 2011

Сначала удалите все записи в таблице «Registration», связанные с указанным StudentId.

Затем удалите его из основной таблицы «StudentDetails».

и для обеспечения согласованности ваших данных используйтесделка.

0 голосов
/ 11 декабря 2011

Обычно лучше использовать транзакцию, особенно при удалении связанных данных из двух таблиц. Используйте параметризацию вместо конкатенации и узнайте больше о SQL-инъекции .

Ваш код должен выглядеть примерно так:

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 на то, чем он является.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...