Sheraz M Ответов: 2

Удаление данных из нескольких таблиц в VB.NET


Я хочу удалить полные данные из нескольких таблиц. Ниже приведен мой код, который всегда будет блокировать else без каких-либо ошибок.

Что я уже пробовал:

Private Sub CleanToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles CleanToolStripMenuItem.Click

        Dim result As DialogResult = MessageBox.Show("", "Confirm Delete?", MessageBoxButtons.YesNo)

        If (result = DialogResult.OK) Then

            db_connect.Open()

            Dim trans As SqlClient.SqlTransaction = db_connect.BeginTransaction()
            Dim cmd As SqlClient.SqlCommand = db_connect.CreateCommand()

            Try 'delete from all tables
                cmd.CommandText = "delete * from customer"
                cmd.ExecuteNonQuery()

                cmd.CommandText = "delete * from account"
                cmd.ExecuteNonQuery()

                cmd.CommandText = "delete * from employee"
                cmd.ExecuteNonQuery()

                trans.Commit()
            Catch   'got an error - roll back the transaction  
                trans.Rollback()

            Finally 'close the connection
                db_connect.Close()

            End Try

        Else
            MessageBox.Show("else")

        End If
    End Sub
End Class

2 Ответов

Рейтинг:
2

phil.o

Вы могли бы использовать TRUNCATE вместо этого, поскольку вы не включаете никаких WHERE оговорка в ваших запросах, то все записи будут удалены.

TRUNCATE TABLE [customer];
TRUNCATE TABLE [account];
TRUNCATE TABLE [employee];


Richard Deeming

TRUNCATE TABLE не будет работать, если на таблицу ссылаются какие-либо внешние ключи или она используется в индексированном представлении. :)

Усечение таблицы (Transact-SQL) - SQL Server | Microsoft Docs[^]

phil.o

Я знал это для внешних ключей, но не для индексированных представлений. Спасибо.

Рейтинг:
14

0x01AA

Заменять result = DialogResult.OK с result = DialogResult.Yes и это должно сработать.


Sheraz M

Пробовал, теперь не собираюсь еще блокировать, но записи все равно не удаляю.

0x01AA

Какой SQL-сервер вы используете? Кстати delete * from customer должно быть больше delete from customer (также для других без *)

Sheraz M

Microsoft SQL Server 2017, пробовал как*, так и без *, но безуспешно.

0x01AA

Любые ограничения внешнего ключа, которые препятствуют удалению (с другой стороны, это обычно вызывает исключение)?

Sheraz M

Никаких ограничений внешнего ключа, следующая ошибка, которую я получил от блока catch,

"ExecuteNonQuery требует, чтобы команда имела транзакцию, когда соединение, назначенное команде, находится в ожидающей локальной транзакции. Свойство Transaction команды не было инициализировано."

0x01AA

Если я в Google сообщение об ошибке я вижу в этом большое предложение времени :
trans= con.BeginTransaction();
cmd = new SqlCommand(query, con, tran);

Sheraz M

Спасибо, это работает.

0x01AA

Добро пожаловать. Спасибо, что согласились.