|
|
|
Error details
|
|||
|---|---|---|---|
|
#18+
Когда при выполнении SQL-запроса происходит ошибка, то на клиенте ее можно анализировать, вытаскивая ее код, текст сообщения и т.д. В sysmessages в поле description предусмотрены параметры (как обычное сишное форматирование строк - %d, %s, ...). Когда ошибка доходит до клиента, то текст сообщения уже сформирован с участием переданных параметров и я вижу цельный текст ошибки. Есть ли возможность на клиенте вытащить сами параметры ? Один из примеров, когда это нужно: при выполнении запроса срабатывает один из constraint'ов, и мне нужно узнать, какой именно привел к ошибке, получить его название или id. В OLEDB есть интерфейс IErrorRecords с методом GetErrorParameters, но там всегда оказывается 0 параметров. Any ideas ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2001, 12:18:53 |
|
||
|
Error details
|
|||
|---|---|---|---|
|
#18+
Такая возможность есть, подробности тут: Оповещения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2001, 12:43:45 |
|
||
|
Error details
|
|||
|---|---|---|---|
|
#18+
Ну и причем здесь оповещения ? Кинуть raiserror со своим описанием/параметрами - здесь никаких проблем не возникает. У меня обратная задача - когда ошибка пришла, вытянуть из нее не текст сообщения целиком, а именно получить параметры, которые туда были положены. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2001, 14:41:36 |
|
||
|
Error details
|
|||
|---|---|---|---|
|
#18+
Согласен, недосказал свою мысль... Я имел ввиду, что можно определить дополнительные события и оповещения, в которых оставить только метки форматирования в фиксированном Вами порядке. Тогда, добавив в логике пользователя дополнительные RAISERROR, Вы сможете получить и интерпритировать полученные в ответ метки. То, какие метки применяются в каждом конкретном случае, можно посмотреть в описаниях ошибок. Всё было бы намного проще, если бы на одно событие/ошибку можно было бы получать два или более оповещения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2001, 15:14:59 |
|
||
|
Error details
|
|||
|---|---|---|---|
|
#18+
Спасибо за идею, но... Меня больше интересует ситуация со стандартными constraint'ами, а не теми, которые определяю я. То есть навешиваю я на таблицу несколько ограничений - пару unique, пару foreign key и т.д. Когда не прошла вставка в таблицу, меня интересует, _какое_именно_ ограничение вызвало ошибку, а не только сам факт ее. Единственный способ, который мне с самого начала приходил в голову - переложить все проверки на триггер, а в нем как раз выбрасывать сгенеренные мной сообщения. Но это неудачный способ в плане архитектуры и производительности. Ведь использование constraint'ов предпочтительнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2001, 16:58:22 |
|
||
|
Error details
|
|||
|---|---|---|---|
|
#18+
oldmsg=dbmsghandle((DBMSGHANDLE_PROC)msg_handler); olderr=dberrhandle((DBERRHANDLE_PROC)err_handler); ... int msg_handler(DBPROCESS *dbproc,DBINTmsgno,int msgstate, int severity,char *msgtext) { if (severity > 0) { SendMessage(hnd,WM_USER+1,0,(LONG)msgtext); return(0); } int err_handler(DBPROCESS *dbproc,int severity, int dberr,int oserr,char *dberrstr,char *oserrstr) { if (severity = EXSERVER) MessageBox(hnd,ptr,(LPSTR)"SQL Server error",MB_ICONHAND | MB_OK); else MessageBox(hnd,dberrstr,(LPSTR)"DB-LIBRARY error",MB_ICONHAND | MB_OK); if (oserr != DBNOERR) /* os error */ MessageBox(hnd,oserrstr,(LPSTR)"Operating-System error",MB_ICONHAND | MB_OK); return(INT_CANCEL); /* cancel command */ } Подробнее Вы можете посмотреть в описании DB-LIBRARY for C ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2001, 20:07:58 |
|
||
|
Error details
|
|||
|---|---|---|---|
|
#18+
Наверное, я недостаточно ясно объясняю суть проблемы (( Хотя мне нужен разбор системных сообщений, для ясности приведу пример с пользовательским сообщением об ошибке: exec sp_addmessage @msgnum = 50001, @severity = 16, @msgtext = 'Some error with par1 = %ls; par2 = %ls', @replace = 'replace' Где-нибудь выбрасываю эту ошибку: raiserror (50001, 16, 1, 'aaa', 'bbb') На клиенте я вижу сообщение 'Some error with par1 = aaa; par2 = bbb'. Замечательно. Так вот, мне надо на клиенте отдельно получить значения 'aaa' и 'bbb', а не включенные в общий текст сообщения об ошибке. В случае с родными сообщениями SQL сервера это выглядит так: например, есть такая ошибка, которая генерится при срабатывании constraint'а на уникальность колонки. Это сообщение '%ls statement conflicted with %ls %ls constraint '%.*ls'. The conflict occurred in database '%.*ls', table '%.*ls'%ls%.*ls%ls.' При выбрасывании этой ошибки на клиента приходит текст сообщения ЦЕЛИКОМ, с уже подставленным именем constraint'а. А мне надо, получив это сообщение, выделить из него имя constraint'а и имя таблицы. Мне нужно получить данные параметры ОТДЕЛЬНО от сообщения об ошибке. Ну в виде массива параметров или что-нибудь типа того. Не парсить же пришедшую строку на составляющие ? 8-(( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2001, 12:34:41 |
|
||
|
Error details
|
|||
|---|---|---|---|
|
#18+
2 GreenSunrise По-моему это в принципе невозможно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2001, 12:56:56 |
|
||
|
Error details
|
|||
|---|---|---|---|
|
#18+
Как ни странно, такая возможность похоже заложена, но не имплементирована. IErrorRecords::GetErrorParameters. Но реально там всегда возвращается 0 параметров. И в MSDN написано, что SQLOLEDB сейчас не возвращает параметры клиенту с помощью этой функции. Обидно, да... Ладно, имея на руках шаблонную строку с % и сформированную целиком, распарсить параметры можно. Придется так и сделать - лучшего варианта я пока не вижу Спасибо всем, кто отозвался. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2001, 14:38:47 |
|
||
|
Error details
|
|||
|---|---|---|---|
|
#18+
Очевидно в OLEDB это предусмотрено, но в SQL Server-е таких возможностей нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.04.2001, 15:19:49 |
|
||
|
Error details
|
|||
|---|---|---|---|
|
#18+
Используй регулярные выражения на клиенте. Я только так и разбираю пришедшие сообщения. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2002, 16:07:10 |
|
||
|
Error details
|
|||
|---|---|---|---|
|
#18+
А для чего их вообще разбирать? Это вопрос, т.к. у нас просто показывается тот текст, который пришел. Текст из процедур можно и самим писать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2002, 16:27:12 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32004483&tid=1818436]: |
0ms |
get settings: |
5ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
38ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 193ms |
| total: | 289ms |

| 0 / 0 |
