powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Error details
13 сообщений из 13, страница 1 из 1
Error details
    #32004472
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда при выполнении SQL-запроса происходит ошибка, то на клиенте ее можно анализировать, вытаскивая ее код, текст сообщения и т.д. В sysmessages в поле description предусмотрены параметры (как обычное сишное форматирование строк - %d, %s, ...). Когда ошибка доходит до клиента, то текст сообщения уже сформирован с участием переданных параметров и я вижу цельный текст ошибки. Есть ли возможность на клиенте вытащить сами параметры ? Один из примеров, когда это нужно: при выполнении запроса срабатывает один из constraint'ов, и мне нужно узнать, какой именно привел к ошибке, получить его название или id. В OLEDB есть интерфейс IErrorRecords с методом GetErrorParameters, но там всегда оказывается 0 параметров.
Any ideas ?
...
Рейтинг: 0 / 0
Error details
    #32004473
Фотография Александр Гладченко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такая возможность есть, подробности тут:
Оповещения
...
Рейтинг: 0 / 0
Error details
    #32004479
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и причем здесь оповещения ? Кинуть raiserror со своим описанием/параметрами - здесь никаких проблем не возникает. У меня обратная задача - когда ошибка пришла, вытянуть из нее не текст сообщения целиком, а именно получить параметры, которые туда были положены.
...
Рейтинг: 0 / 0
Error details
    #32004482
Фотография Александр Гладченко
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Согласен, недосказал свою мысль...
Я имел ввиду, что можно определить дополнительные события и оповещения, в которых оставить только метки форматирования в фиксированном Вами порядке. Тогда, добавив в логике пользователя дополнительные RAISERROR, Вы сможете получить и интерпритировать полученные в ответ метки. То, какие метки применяются в каждом конкретном случае, можно посмотреть в описаниях ошибок.
Всё было бы намного проще, если бы на одно событие/ошибку можно было бы получать два или более оповещения.
...
Рейтинг: 0 / 0
Error details
    #32004483
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за идею, но... Меня больше интересует ситуация со стандартными constraint'ами, а не теми, которые определяю я. То есть навешиваю я на таблицу несколько ограничений - пару unique, пару foreign key и т.д. Когда не прошла вставка в таблицу, меня интересует, _какое_именно_ ограничение вызвало ошибку, а не только сам факт ее.
Единственный способ, который мне с самого начала приходил в голову - переложить все проверки на триггер, а в нем как раз выбрасывать сгенеренные мной сообщения. Но это неудачный способ в плане архитектуры и производительности. Ведь использование constraint'ов предпочтительнее.
...
Рейтинг: 0 / 0
Error details
    #32004489
Fompro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
...
Рейтинг: 0 / 0
Error details
    #32004516
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверное, я недостаточно ясно объясняю суть проблемы
((
Хотя мне нужен разбор системных сообщений, для ясности приведу пример с пользовательским сообщением об ошибке:

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-((
...
Рейтинг: 0 / 0
Error details
    #32004517
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 GreenSunrise

По-моему это в принципе невозможно
...
Рейтинг: 0 / 0
Error details
    #32004531
GreenSunrise
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как ни странно, такая возможность похоже заложена, но не имплементирована. IErrorRecords::GetErrorParameters. Но реально там всегда возвращается 0 параметров. И в MSDN написано, что SQLOLEDB сейчас не возвращает параметры клиенту с помощью этой функции. Обидно, да... Ладно, имея на руках шаблонную строку с % и сформированную целиком, распарсить параметры можно. Придется так и сделать - лучшего варианта я пока не вижу

Спасибо всем, кто отозвался.
...
Рейтинг: 0 / 0
Error details
    #32004534
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очевидно в OLEDB это предусмотрено, но в SQL Server-е таких возможностей нет
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Error details
    #32073504
Sergey Gerasin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Используй регулярные выражения на клиенте. Я только так и разбираю пришедшие сообщения. :)
...
Рейтинг: 0 / 0
Error details
    #32073519
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А для чего их вообще разбирать? Это вопрос, т.к. у нас просто показывается тот текст, который пришел.
Текст из процедур можно и самим писать.
...
Рейтинг: 0 / 0
Error details
    #32073543
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Sergey Gerasin: Вот так и надо.

Приходит сообщение об ошибке->Если C++, то ловите исключение-> получаете строку с ошибкой и парсите ее как вам надо->не обязательно регулярные выражения, но можно и их
:)
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Error details
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]