Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как получить через ADO результаты работы триггера? [D6, MSSQL]


Oleg(tm) ©   (2003-03-09 19:23:00) 

ADOCommand вызвает на SQL-сервере "DELETE FROM ля-ля-ля".
На сервере отрабатывает триггер и пишет ответы.

Как средствами Дельфи узнать, удалилась ли запись, и прочитать все print и raiserror?


jocko   (2003-03-11 13:18:00) [1]

>sniknik ©
полностью согласен, с адо использую только RAISERROR темболее что выполнение процедуры он не прерывает...
а вот print я бы вообще не советовал использовать, и по возможности удалять после отладки, опыт подсказывает - может вызвать глюки непонятьной природы.
Да, а результат выполнения можно возвратить присвоением нужного RETURN ...


KSergey   (2003-03-11 13:16:00) [2]

Пример офигенный! Спасибо.
Вот только PRINT лично мне поймать (найти) не удалось.
Ну не попадается оно мне в Error Collection, хотя мне попадалось подобное утверждение на SQL.ru
Может есть готовый пример для отлова именно Print?


sniknik   (2003-03-11 11:19:00) [3]

не закончил, случайно нажал отправить.

sniknik © (11.03.03 11:15) ..... т.е. можно его получить как банальный error если конечно гдето informational ошибки не отсекаются. (посмотреть надо)
но тогда вообще зачем огород городить? RAISERROR прекрасно ловятся. а разници как оказывается между ними минимум.


sniknik   (2003-03-11 11:15:00) [4]

обещаная ссылка
http://home.earthlink.net/~akonshin/delphi_components.htm
(см. MS SQL Alerter. работает точно, проверял, по этому принципу можно сделать) тут сделано оповещение по сети.

ну еще почитал о PRINT встретил такую любопытную фразу
The message is returned as an informational error in ADO, OLE DB, and ODBC applications.


sniknik   (2003-03-10 19:28:00) [5]

еще.
пример не показательный получился. если бы там три SELECT-а были то так бы и вернуло 3 рекордсета полноценных 1-м пакетом, присваивай каждый своему DataSet-у и отображай в 3 грида.


sniknik   (2003-03-10 19:24:00) [6]

ну вообщето я не про то (см. пред. имел ввиду инсерты делиты и тд.).
а на этом примере вот что у меня получается (исключительно через ADO).

делаю твою процедуру

CREATE PROCEDURE sp_test() AS
BEGIN
PRINT "Message 1"
PRINT "Message 2"
PRINT "Message 3"
END
результат
1 Выполнено применительно к -1 записям. (no recordset)

делаю EXEC sp_test
результат
2 Выполнено применительно к -1 записям. (no recordset)
применительно к -1 записям. (no recordset)
применительно к -1 записям. (no recordset)
вернуло 3 пустых рекордсета, по одному на сообщение, это единственное что можно получить (количество) таким способом. (во всяком случае как получить больще я не знаю).

получается просто.
ADOCommand1.CommandText:= sCommand; //любая команда
Recordset:= ADOCommand1.Execute(RecordsAffected, EmptyParam); //выполняем
if Recordset.State=1 then RichEdit2.Lines.Add(IntToStr(ErrCount)+" Выполнено применительно к "+IntToStr(Recordset.RecordCount)+" записям") //если получили открытый рекордсет
else RichEdit2.Lines.Add(IntToStr(ErrCount)+" Выполнено применительно к "+IntToStr(RecordsAffected)+" записям. (no recordset)"); //остальное

дальше цикл типа
while Recordset <> nil do begin

try //не вывалится из главного цикла если провайдер не понимает мульти DataSet
Recordset:= Recordset.NextRecordset(RecordsAffected2); //получаем следующий или пустой (nil) если кончились
RecordsAffected:= integer(RecordsAffected2);
except
Recordset:= nil;
end;
end;

не совсем то что хотелось(лутше бы там было "Message ?" гдето вшито), но я говорил для этого нужно по другому внешняя dll (процедура, COM обьект вроде не помню, 1 раз пробовал, в жизни не пригодилось :-)), ссылку завтра если интересно) вызываеш паралельно/вместо print а она уже передает проге. вот так.
да SET NOCOUNT должен быть OFF иначе ничего не вернет.
все.


BlackTiger   (2003-03-10 18:35:00) [7]

>sniknik © (10.03.03 16:39)

Хммм... Это как? Вот сейчас пытаюсь "побаловаться". Сделал простенькую ХП

CREATE PROCEDURE sp_test() AS
BEGIN
PRINT "Message 1"
PRINT "Message 2"
PRINT "Message 3"
END


И пытаюсь получить как-нибудь через АДО именно то, что выдает "Query Analyzer" при "EXEC sp_test". А он выдает

Message 1
Message 2
Message 3


Как получить это же Дельфями?
Я видел методы NextRecordset, но как их использовать?
Интересно уже стало самому.


sniknik   (2003-03-10 16:39:00) [8]

BlackTiger (10.03.03 16:24)
из ХП узнать "удалилась ли запись" не состовляет проблем, будет возвращена инфа о всех командах обрабатывающих данные, через множественный рекордсет. (при SET NOCOUNT OFF) нужно только обработать последовательно каждый.

а по вопросу можно через внешнюю dll посылать информацию программе. (была ссылка на такую на работе, поищу завтра, если до этого никто не вспомнит) естественно там нужно дополнительно к print вызывать метод.


BlackTiger   (2003-03-10 16:24:00) [9]

Что-то мне подсказывает, что никак. Много раз возникал подобный вопрос. Никто правда не хотел это получить из триггеров, все только из ХП.

Решение "в лоб" - ХП и триггера должны "отчитываться" во временную таблицу, из которой потом можно получить "отчет" о выполнении, а не через PRINT. АДО-шные (не уверен, что только Дельфийский интерфейс к ним) компоненты, вроде не умеют получать мессаги, а только рекордсеты.

Если что узнаешь - СРАЗУ КИНЬ В ФОРУМ! Многим поможешь.


KSergey   (2003-03-10 12:50:00) [10]

Недавно про что-то подобное читал на форуме SQL.ru
Попробуйте, может попадется...


Наверх

Титульная страница Поиск, карта сайта Написать письмо