Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.008 c
1-88042
Lady Natalia
2003-03-13 16:53
2003.03.27
внешний вид формы


1-87886
neodiX
2003-03-13 17:50
2003.03.27
Назначение нового адреса переменной pointer


6-88124
3d[Power]
2003-01-23 08:04
2003.03.27
Sockets, winsock.pas


8-88077
sergn
2002-12-16 17:26
2003.03.27
Попадание курсором мыши на букву.


14-88228
VID
2003-03-11 21:59
2003.03.27
EXCEL: создание особого файла...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский