Форум: "Базы";
Текущий архив: 2003.03.27;
Скачать: [xml.tar.bz2];
ВнизКак получить через 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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.009 c