![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как получить через 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
Попробуйте, может попадется...