|
Ошибка при отображении текста RAISERROR
|
|||
---|---|---|---|
#18+
Сразу оговорюсь: серверные гуру в теме Microsoft SQL Server меня послали. Дескать, рукава у нас пошиты правильно, а то, что костюмчик не сидит - дело не наше. Точно так же меня могут послать и в этой теме - из текста ниже будет понятно, почему. Итак, проблема: есть некая база данных на SQL Server и есть клиентское приложение. К таблице в БД есть триггер, который формирует сообщения об ошибке и откатывает трансакции если это надо. В конкретном случае ошибка генерируется при вводе пользователем данных, приводящих к превышению некоего лимита. В теле триггера формируется строка, информирующая об ошибке с подробным пояснением, что и почему, и что пользователю надо сделать. Далее, сообщение возвращается клиенту с помощью RAISERROR и трансакция откатывается через ROLLBACK TRANSACTION. На клиенте VFP есть база выборок с коннектом через стандартный ODBC драйвер Microsoft. Строка коннекта максимально кратка: Driver=SQL Server, Server=XXX, Database=XXX, TrustedConnection=YES (последнее, согласно принятой политике безопасности внутри предприятия). Это необходимый минимум. К сожалению, примерно год назад был вынужден добавить опцию NETWORK=DBNMPNTW, чтобы переключить взаимодействие с сервером на протокол именованных каналов. Именно - к сожалению, причина - отдельный топик. Пользователь на клиенте вводит данные, вызывается TABLEUPDATE(), если он неудачный, то вызывается AERROR(), а потом TABLEREVERT(). Текст сообщения об ошибке в возвращаемом массиве AERROR() показывается пользователю посредством MESSAGEBOX. Все дубово просто, как ... Это преамбула. А вот амбула: на WinXP все работало зашибись. На Win7 в некоторых случаях и на некоторых машинах наблюдается глюк: текст сообщения RAISERROR произвольным образом обрезается - иногда сначала, иногда с конца - и пользователю показывается оставшийся кусок. При этом буквально на соседней машине этого не наблюдается в тот же день и в тот же час, с тем же приложением и в той же ситуации. Последний раз столкнулся с этим позавчера, причем события во времени развертывались так: пользователь работал на Win7 и горя не знал. Каспер (в очередной раз!) угробил машину. У наших системщиков нет иного метода, кроме как с перхотью отрубить голову: на машине сносится все, ставится эталонная ОС из образа. Я потом просто ставлю (опять-таки в очередной раз) VFP RunTime, сгенерированный InstallShield, и ярлыки на экзешники. Ничего не меняя в аплликейшен вообще. Пользователь начинает работать - и звонит с претензией. Я запускаю тот же самый экзешник - у меня ничего подобного, сообщение неискаженное. Дистанционно подключаюсь к юзеру - искажено. Далее начинаю играться с текстом сообщения. Грохаю все, кроме пары слов - все зашибись показывает. Начинаю добавлять в текст слово за словом. До некоторого момента все идет отлично, но с некоторой очередной буквы (!!!) все нахрен пропадает. В хелпе на SQL написано, что текст RAISERROR ограничен 2038 символами, при превышении данной длины будет показано 2045 символов и три точки. Более никаких ограничений нет. Я к этому лимиту и близко не приближаюсь. В некоторых случаях данного глюка помогала замена русских букв на транслит, но не в последнем случае. Кое-как подхимичил сообщение, подсократив там и сям. Чтобы пользователь мог работать. На следующий день решил еще поиграться. Но глюк исчез - т.е. возврат к предыдущему тексту искажение текста уже не вызвал. Экзешник не менялся ни на байт, настройки не менялись тоже. Единственная разница: в очередной раз прилетел бесконечный поток обновлений от системщиков. Я предполагаю, что собака порылась либо во взаимодействии ODBC драйвера клиента с сервером, либо во взаимодействии его же с VFP. Но в последнее верится меньше, поскольку Microsoft VFP давно уже не занимается, обновлений на него нет. Но хотелось бы понять, какие собственно обновления надо обязательно ставить на новую машину, чтобы избежать этой неприятности. Нечто вроде хотфикса. Потому что понять, что к чему в том потоке, который идет от наших системщиков, мягко говоря, очень трудно. Может, кто сталкивался с такой проблемой? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2014, 14:14 |
|
Ошибка при отображении текста RAISERROR
|
|||
---|---|---|---|
#18+
Петр К, а теперь тут еще раз: запротоколируйте выход функции Aerror() и только после этого можно что-то дальше думать. Как протоколировать я уже писал в той теме, где я вам написал, что там занимаются только сервером. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2014, 14:26 |
|
Ошибка при отображении текста RAISERROR
|
|||
---|---|---|---|
#18+
Петр Кправильный проходящий., "вставьте в клиент сообщение AERROR и хоть обизучайтесь" - а что я, по-вашему, делаю? Вы хоть читали текст? Именно на этом и построена обработка ошибок. Означенный текст берется и показывается клиенту.Это ДВА действия - получение данных и их отображение. Вас просят показать результат ПЕРВОГО действия. Дабы выяснить после какого действия происходит искажение. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2014, 14:32 |
|
Ошибка при отображении текста RAISERROR
|
|||
---|---|---|---|
#18+
правильный проходящий., Да не вопрос. Вообще-то можно было сразу попросить воспользоваться strtofile без нравоучений ("делайте хоть что-нибудь"). Сделаю. Как только глюк проявится в следующий раз. Сейчас-то он ушел у пользователя, повторить уже не могу. Появится - запротоколирую. Вообще было высказано предположение, что виновата экранная лупа. В данном случае это не так - я пользователям пользоваться ей запрещаю, потому что был опыт с OCX TreeView от Microsoft, который приводил к крашу программы. Только 100%. Как я понимаю, я вообще первый, кто обращается на _данном_ форуме с таким вопросом? Я-то предполагал, что у людей есть опыт. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2014, 14:42 |
|
Ошибка при отображении текста RAISERROR
|
|||
---|---|---|---|
#18+
Петр Кправильный проходящий., Да не вопрос. Вообще-то можно было сразу попросить воспользоваться strtofile без нравоучений ("делайте хоть что-нибудь"). Вам мало указаний на направление действий, вам надо все разжевать и в рот положить? Вот этого мало было: Вот этот самый "текст ошибки, переданный через RAISERROR" в клиенте и надо проверить. До показа в окне. Или вы просто про указанную вам Владом Колосовым функцию не знали? Так спросили бы. Так что не надо тут изображать оскорбленную невинность. Я-то предполагал, что у людей есть опыт.Он и есть. Может не конкретно тот, который вам нужен, но он есть. И какой опыт нужен в вашем случае еще не ясно ибо пока еще не поставлен диагноз. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2014, 14:54 |
|
Ошибка при отображении текста RAISERROR
|
|||
---|---|---|---|
#18+
правильный проходящий., Все, далее можете мне не отвечать. Надоело. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.12.2014, 14:57 |
|
|
start [/forum/topic.php?fid=41&fpage=28&tid=1582479]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
53ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
31ms |
get tp. blocked users: |
2ms |
others: | 20ms |
total: | 148ms |
0 / 0 |