![]() |
Модераторы: Akina |
![]() ![]() ![]() |
|
Hobotanius |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 24.7.2008 Репутация: нет Всего: нет |
Сервер - MS SQLExpress 2005.
Через ADO на C# выполняю запрос(SqlCommand.ExecuteNonQuery()) на удаление строки из таблицы в БД. Метод возвращает значение типа int - колличество строк подвергшихся операции. Но после того как на эту таблицу ставлю свой триггер(instead of delete), то этот метод удаляя одну строку(по id) возвращает значение равное двум. Я подозреваю, что это от того, что я в триггере после всех проверок чтоб удалить строку пишу - delete from [dbo].[ИмяТаблицы] where id = @delete_id. Наверное это не правильно? И надо как-то подругому? И как сделать, чтоб траггер не удваивал возвращаемое значение? |
|||
|
||||
Zioma |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 22.8.2007 Репутация: 5 Всего: 5 |
Каким образом ты определяешь количество удаленных строк?
|
|||
|
||||
Hobotanius |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 24.7.2008 Репутация: нет Всего: нет |
Кол-во удалённых строк должен возвращать метод SqlCommand.ExecuteNonQuery() (при условии, что этот метод использует заранее заданный правильный sql-запрс на удаление). Физически удаляется одна строка - я это знаю потому, что использую запрос типа "delete from [dbo].[Units] where id = 4" т.е. с указанием конкретного идентификатора строки. И метод SqlCommand.ExecuteNonQuery() возвращает всё правильно, но только до тех пор пока я не включаю свой триггер instead of delete на таблицу из которой удаляю строку. В триггере я делаю проверку - действительно ли можно удалить эту строку, и если можно, то в теле триггера пишу - delete from [dbo].[Units] where id = @del_id, где @del_id = deleted.id. После включения триггера метод SqlCommand.ExecuteNonQuery() с заранее заданным sql-запросом типа "delete from [dbo].[Units] where id = 4" начинает возвращать значение 2. |
|||
|
||||
Zioma |
|
||||||||
Бывалый ![]() Профиль Группа: Участник Сообщений: 150 Регистрация: 22.8.2007 Репутация: 5 Всего: 5 |
Как бы то так понятнее объяснить ...
![]() Короче, движок сервера по умолчанию всегда возвращает клиенту количество обработанных строк в виде
Такое ты очевидно видел, когда запускал запросы в утилитах QA или MSSMS. Так вот, выполнение delete + триггер возвратит такое:
То есть система изначально не знает, что есть триггер instead of delete и считает, что "delete from [dbo].[Units] where id = 4" отработала правильно и сигнализирует о 1 строке, которая обработана, хотя реально удаления не было. Плюс к этому в триггере идет реальное удаление и он (триггер) тоже возвращает, что обработано 1 строка. 1 + 1 = 2 И если ты перед выполнением удаления (не в триггере) установишь
то по всей видимости получишь количество обработанных строк = 0. Поэтому, для правильного определения, сколько же строк реально было удалено, необходимо использовать глобальную переменную:
|
||||||||
|
|||||||||
Hobotanius |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 24.7.2008 Репутация: нет Всего: нет |
Спасибо за ответ, вечером попробую и отпишусь.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "MS SQL" | |
|
Запрещается! Публиковать ссылки и обсуждать взлом чего бы то ни было.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | MS SQL Server | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |