Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Коммуникация из extended stored proc с Дельфи-клиентом  [new]
Vetal
Member

Откуда: Киев
Сообщений: 1019
Всем привет!

У меня следующая проблема. Моя рхп возвращает в случае ошибки сообщение следующей командой:
  srv_sendmsg(pSrvParams, SRV_MSG_ERROR, SQLERR_BASE, 0, 1, nil, 0, 0, pchar(sMsg), SRV_NULLTERM);


Была написана хранимая процедура sp_MyProc. В ней моя расш.хр.проц. вызывается несколько раз. В случае, если запускаю хранимую процедуру sp_MyProc в Query Analyzer, мне в закладку Messages возвращается несколько сообщений об ошибках, если несколько расш.хр.проц. отработали с ошибкой.

Если я вызываю sp_MyProc из Дельфи-клиента, то в случае, если несколько рхп вернули сообщение об ошибке, мне возвращается в мой Дельфи-клиент только первое сообщение в виде EOLEException. Кроме того, если в процедуре sp_MyProc существуют операторы SELECT до вызова рхп, возвращающей ошибку, то в моем Дельфи клиенте даже не генерится Исключение.

Как мне сделать, чтобы процедура sp_MyProc стабильно возвращала все сообщения, сгенерированные моей рхп, и они отображались в Дельфи-клиенте (хотя бы как исключение)?

Всем заранее спасибо за ответы
24 июн 03, 13:34    [239957]     Ответить | Цитировать Сообщить модератору
 Re: Коммуникация из extended stored proc с Дельфи-клиентом  [new]
ziktuw
Member

Откуда:
Сообщений: 3552
Делай асинхронный вызов. Тогда исключение на первой ошибке генерится не будет и все ошибки, после полного засоса рекордсета, будет лежать в коллекции Errors объекта Connection.
24 июн 03, 14:07    [239987]     Ответить | Цитировать Сообщить модератору
 Re: Коммуникация из extended stored proc с Дельфи-клиентом  [new]
Vetal
Member

Откуда: Киев
Сообщений: 1019
Я тут все поковырял, почитал BOL и пришел к следующим выводам. Если я не прав, поправьте меня кто-нить пожалуйста.

При выполнении хр.процедуры sp_MyProc сервер посылает клиенту все мессаги и рекордсеты, которые передает хранимая процедура. Как клиент распорядится с полученным добром, зависит от технологии, на которой написан клиент.

Я рассматривал все для трех технологий: ODBC, ADO (при не асинхронном вызове) и DB LIB. Для клиентов, написанных на любой из технологий, справедливо следующее:
Клиент принимает первое сообщение, если оно имеет тип "ошибка", генерится исключение (при использованиее ODBC в теле исключения содержатся все последующие сообщения, включая информационные, при исп. других технологий только первое сообщение об ошибке). Если же первое сообщение имеет информационный тип или "n row(s) affected", то никакого исключения не генерится.
При этом, если до первого сообщения хр.процедура возвращала строку рекордсета, то исключение не генерится также.

Как бороться. Я обнаружил, что в процедуре sp_MyProc вызываются Insert Into перед вызовами расш.процедур, возвращающих сообщения об ошибках. А Insert Into возвращает строку "n row(s) affected", и поэтому исключение в Дельфи-клиенте не генерится. Поэтому я поставил SET NOCOUNT ON в начале моей процедуры. Дельфи-клиент написан на ДБ ЛИБ, и при таком написании процедуры первое сообщение должно появляться. Способ вроде как некрасивый, но работает.

Но остается открытым вопрос: Как сделать так, чтобы с использованием технологии ДБ ЛИБ можно было отображать все сообщения об ошибках?
И как можно решить проблему, когда возвращаются одновременно и рекордсеты и сообщения?

Всем заранее спасибо
25 июн 03, 17:11    [241660]     Ответить | Цитировать Сообщить модератору
 Re: Коммуникация из extended stored proc с Дельфи-клиентом  [new]
Vetal
Member

Откуда: Киев
Сообщений: 1019
Я тут вот подумываю о том, что было бы неплохо перехватывать сообщения, которые посылаются моими рхп к серверу, в процедуре sp_MyProc, а затем складывать эти сообщения в какую-нить таблицу логов.
Но тут сразу возникает вопрос: а можно ли в хранимой процедуре обрабатывать сообщения, посылаемые к серверу?

Подскажите, может кто-знает. И Подскажите пожалуйста что-нить по предыдущему моему вопросу.
26 июн 03, 15:14    [242923]     Ответить | Цитировать Сообщить модератору
 Re: Коммуникация из extended stored proc с Дельфи-клиентом  [new]
Vetal
Member

Откуда: Киев
Сообщений: 1019
Всем привет!

БООООльшое всем спасибо за Вашу отзывчивость и помощь. За все ответы и советы.

Народ, ну подскажите кто-че знает по данной проблематике.

Пожаалуйста.
27 июн 03, 17:22    [244666]     Ответить | Цитировать Сообщить модератору
 Re: Коммуникация из extended stored proc с Дельфи-клиентом  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
extended stored proc здесь не при чем, тоже самое могло бы быть и из обычной процедуры

по-моему надо вызывать NextRecordset method (TCustomADODataSet)

Если работать через ДБ ЛИБ(непонятно только зачем), то там всё проще, пишутся процедуры, которые будут ловить сообщения об ошибках и от принтов и устанавливаются как обработчики.

и ёрничать не надо, никто не обязан Вам отвечать, тем более если этого не знает
27 июн 03, 19:41    [244815]     Ответить | Цитировать Сообщить модератору
 Re: Коммуникация из extended stored proc с Дельфи-клиентом  [new]
Vetal
Member

Откуда: Киев
Сообщений: 1019
Большое спасибо! Надо будет проверить.

Я тут почитал, похоже это поможет только для нескольких наборов данных. Ну а если хранимая процедура возвращает нексколько сообщений?! Это вряд ли поможет. Ведь объект RecordSet не содержит информации о сообщениях. А я хотел бы иметь доступ ко всем сообщениям.

А по поводу ерничая, то не обижайтесь. Я понимаю что никто мне ничего здесь не обязан. Поэтому если я кого обидел, то приношу извинения.
27 июн 03, 19:58    [244825]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить