Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.03.27;
Скачать: CL | DM;

Вниз

Как получить через ADO результаты работы триггера?   Найти похожие ветки 

 
Oleg(tm)   (2003-03-09 19:23) [0]

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

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


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

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


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

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

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

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


 
sniknik ©   (2003-03-10 16:39) [3]

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

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


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

>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 19:24) [5]

ну вообщето я не про то (см. пред. имел ввиду инсерты делиты и тд.).
а на этом примере вот что у меня получается (исключительно через 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 иначе ничего не вернет.
все.


 
sniknik ©   (2003-03-10 19:28) [6]

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


 
sniknik ©   (2003-03-11 11:15) [7]

обещаная ссылка
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-11 11:19) [8]

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

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


 
KSergey ©   (2003-03-11 13:16) [9]

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


 
jocko ©   (2003-03-11 13:18) [10]

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



Страницы: 1 вся ветка

Текущий архив: 2003.03.27;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.019 c
1-88027
Z_man7777
2003-03-14 07:18
2003.03.27
Нажав на кнопку, как оставить фокус на предыдущем контроле


3-87839
Nazer
2003-03-10 17:04
2003.03.27
Пароль и логин для базы данных IB


6-88114
Cosmic
2003-02-05 07:50
2003.03.27
А как отключить порт?


14-88238
Думкин
2003-03-12 06:35
2003.03.27
О начальстве


3-87872
ED
2003-03-11 13:06
2003.03.27
Позиционирование DBGrid при использовании Interbase 6