|
DataWindow (на Stored Procedure) + MS SQL 2000 и обработка RAISERROR
|
|||
---|---|---|---|
#18+
Ситуация: PB 10.5.2 Build 7611 MS SQLServer 2000 DataWindow построенно на хранимой процедуре. В поцедуре есть бизнес проверки, которые инициируют в ряде случаев ошибку (raiserror). Собственно я привел пример - маленькую процедурку, эмулирующую эту ситуацию, т.е. передал ей 'Y' она ругается, нет - возвращает resultset CREATE PROCEDURE _test @raiseerror_f CHAR(1) = 'N' AS BEGIN DECLARE @err_msg VARCHAR(255) IF @raiseerror_f = 'Y' BEGIN SELECT @err_msg = 'все плохо!!!' GOTO ERROR_EXIT END ELSE SELECT name_alt FROM account_type_c RETURN 1 ERROR_EXIT: RAISERROR 13001 @err_msg RETURN -1 END GO GRANT EXECUTE ON _test TO public GO Так вот, в случае ошибки PowerBuilder должен вернуть в sqlerrtext строку "все плохо!!!", но вместо этого возвращает: Database error code: 999 Select error: Requested resultset number 1 not found." Я поверил эту ситуацию на PowerBilder 6.5 - он ведет себя правильно, возвращая действительное описание ошибки. Если на PowerScript`e написать embedded sql код, то все работает, но обычное DW на хранимой процедуре при вызове банального retrieve() ведет себя таким странным образом. Руками релизовал "ручной retrieve" через событие SQKPreview подменив вызов процедуры для получения resultseta через embedded sql код с ручной обработкой ошибки и ее инициализации и в случае отсутствия оной fetch для заполнения DW с отключенной на время отрисовкой ... но это МАРАЗМ. Я работаю с PB с 3-й версии и такой ошибки я не встречал. Звонил в Московский Сайбейс ... пока на работе уточняют покупали ли мы тех поддержку в нем пишу сюда, своим коллегам. Если даже техподержки нет, имхо сайбес обязан выслушать и записать данные о баге с последующим обещанием поправить в следующем EBF иначе это как покупка чайника. который неработает и который вообще говоря моэно вернуть продавцу... ладно, мне все равно. я обошел проблему на уровне предка написав код, но вообще я в шоке от таких ляпов. Посмотрите ... что скажете? Что посоветуете? ... ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2008, 13:30 |
|
DataWindow (на Stored Procedure) + MS SQL 2000 и обработка RAISERROR
|
|||
---|---|---|---|
#18+
Кто как выкручивается из этой ситуации? Подтвердите мне, что я не одинок с этой проблемой ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2008, 13:40 |
|
DataWindow (на Stored Procedure) + MS SQL 2000 и обработка RAISERROR
|
|||
---|---|---|---|
#18+
PavelBuilder Посмотрите ... что скажете? Что посоветуете? ... На 9 такого нет. Можно попробовать после (или перед???) RAISERROR вернуть пустой select такой же по форме, который ожидает DataWindow - IMHO должно сработать, но это же везде менять нужно, так что в предке наверное лучше, но опять же если данных много... ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2008, 13:50 |
|
DataWindow (на Stored Procedure) + MS SQL 2000 и обработка RAISERROR
|
|||
---|---|---|---|
#18+
Т.е. я не одинок? Так как вы тогда живете то? Или все пишут несерьезные приложения? ... ( постите - никого не хочу задеть этой фразой) Дарю изящное решение, код dberror: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35.
Пока не скажу, что это подойдет во всех без исключения случаях. Но для приложения отчетов. кои я сейчас ковыряю, вполне проходит. У меня все отчеты имеют общего предка, так что поместив в его DW код на dberror я покрываю ошибку и могу принимать из базы верные сообщения об ошибках (мне это неорбходимо, например, выдавая сообщения "Отчет не может быть сформирован на дату позднее чем дата закрытия баланса по информационному регистру" ... кто в теме - поймет, кто нет, смысл тоже ясен. Я уже писал, что я реализовал обход в SQLPreview, но он плохо поддается универчальному написанию кода, сейчас я передлал на dberror/ тот что привел. Я на верном пути? Скажите честно - этот баг не только у меня (нужно торговаться с Сайбесом, во благо нас всех, чтобы пофиксили ... суки ... простите ...) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2008, 14:30 |
|
DataWindow (на Stored Procedure) + MS SQL 2000 и обработка RAISERROR
|
|||
---|---|---|---|
#18+
несколько слов покомментирую насчет: mid(sqlsyntax, 2) в пред.примере кода Билдер зачем то передавая параметр в событие ставит единичку вначале sqlsyntax. типа "1 execute( ...." я ее обрезаю. Учитывая, что у меня все отчеты на хранимках, меня это устраивает, на DW построенных на чистых select`ах не проверял пока, можете сами поверить, но с другой стороны ошибка в отлаженом селекте это совсем другое дело и другая ошибка ... потому можно не заморачиваться, если свалится по причине ... какой нибудь причине. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2008, 14:35 |
|
DataWindow (на Stored Procedure) + MS SQL 2000 и обработка RAISERROR
|
|||
---|---|---|---|
#18+
PavelBuilder wrote: > Так как вы тогда живете то? Замечательно . Кто как, а я не возвращаю ошибок из процедур. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2008, 14:36 |
|
DataWindow (на Stored Procedure) + MS SQL 2000 и обработка RAISERROR
|
|||
---|---|---|---|
#18+
Локшин Марк PavelBuilder Посмотрите ... что скажете? Что посоветуете? ... На 9 такого нет. Можно попробовать после (или перед???) RAISERROR вернуть пустой select такой же по форме, который ожидает DataWindow - IMHO должно сработать, но это же везде менять нужно, так что в предке наверное лучше, но опять же если данных много... Марк, я пробовал. Билдер тогда не сообщает об ошибке ничего. Т.е. он наедается тем, что резатсет есть и молчит в тряпочку, зажимая сообщение по raiserror. Т.е. попросту он банально не обрабатыавет сообщение об ошибке по raiserror и ругается на то что нет резалтсета, которого и быт не может в случае ошибки, а если все же дать ему его ... см. я писал в пред. преждложении :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2008, 14:41 |
|
DataWindow (на Stored Procedure) + MS SQL 2000 и обработка RAISERROR
|
|||
---|---|---|---|
#18+
PavelBuilderТ.е. я не одинок? Так как вы тогда живете то? Лично я такой ошибки не видел. А если сменить способ подключения к БД, (ODBC-OLE DB или наоборот) то проблема остается? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2008, 14:44 |
|
DataWindow (на Stored Procedure) + MS SQL 2000 и обработка RAISERROR
|
|||
---|---|---|---|
#18+
Dim2000 PavelBuilder wrote: > Так как вы тогда живете то? Замечательно . Кто как, а я не возвращаю ошибок из процедур. Posted via ActualForum NNTP Server 1.4 Значит вы не пишите процедур. Любая процедура предполагает некие действия, которые могут быть выполнены или могут быть не выполнены (например, вы подошли к банкомату вставили карту, указали сумму и ждете денег, итог: или вы снимаете деньги с карты и получаете деньги или все остается как было, помежуточного состояния быть не может(деньги с карты сняты, а денег не дали ил наоборот). Это называется "транзакция" (не транзакция в базе данных, хотя смысл схож) И несообщить об ошибке попросту нельзя) Пример не мой, я работаю с ценными бумагами(депозитарий), но по сути очень похоже. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2008, 14:46 |
|
DataWindow (на Stored Procedure) + MS SQL 2000 и обработка RAISERROR
|
|||
---|---|---|---|
#18+
Локшин Марк PavelBuilderТ.е. я не одинок? Так как вы тогда живете то? Лично я такой ошибки не видел. А если сменить способ подключения к БД, (ODBC-OLE DB или наоборот) то проблема остается? Соединяемся конечно через OLE DB, даже если через другой тип соединения будет иначе это не выход из решения проблемы (нужно пользоваться oledb, тут возражений нет?) На PB 6.5 проверял и писал - проблем нет, Вы подтвердили, что с девяткой тоже нет проблем, но мы уже соскочили с нее ... ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2008, 14:50 |
|
DataWindow (на Stored Procedure) + MS SQL 2000 и обработка RAISERROR
|
|||
---|---|---|---|
#18+
PavelBuilder wrote: > Значит вы не пишите процедур. Пишу. Правда, не на каждый чих. > транзакция в базе данных, хотя смысл схож) И несообщить об ошибке > попросту нельзя) Пример не мой, я работаю с ценными > бумагами(депозитарий), но по сути очень похоже. Я, в общем, тоже, так что мне такие банальности можно не объяснять ;). Об ошибках мои процедуры сообщают кодом завершения, но они совершенно не предназначены для делания из них DW (а то, что предназначено для изготовления DW, ошибок не выдаёт). Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2008, 15:07 |
|
DataWindow (на Stored Procedure) + MS SQL 2000 и обработка RAISERROR
|
|||
---|---|---|---|
#18+
1. регистрируйте баг в сайбесе (имеете право) поднимайте важность до большого уровня. 2. что если в процедуре перед райзеррор написать SELECT name_alt FROM account_type_c WHERE 1=0 ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2008, 15:14 |
|
DataWindow (на Stored Procedure) + MS SQL 2000 и обработка RAISERROR
|
|||
---|---|---|---|
#18+
PavelBuilderдаже если через другой тип соединения будет иначе это не выход из решения проблемы Зато будет информация к размышлению. Dim2000а то, что предназначено для изготовления DW, ошибок не выдаёт Не выдает потому, что никогда не возникают? Что-то сомнительно... ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2008, 15:17 |
|
DataWindow (на Stored Procedure) + MS SQL 2000 и обработка RAISERROR
|
|||
---|---|---|---|
#18+
вы забыли просто указать severity (уровень серъезности) - зависит от типа соединения (NATIVE,ODBC,OLE DB) severity Определенный пользователем уровень серьезности, связанный с этим сообщением. Если при помощи аргумента msg_id вызываются пользовательские сообщения, созданные процедурой sp_addmessage, уровень серьезности, указанный в инструкции RAISERROR, заменяет уровень серьезности, указанный в процедуре sp_addmessage. Уровень серьезности от 0 до 18 может указать любой пользователь. Уровни серьезности от 19 до 25 могут быть указаны только членами фиксированной серверной роли sysadmin и пользователями с разрешениями ALTER TRACE. Для уровней серьезности от 19 до 25 требуется параметр WITH LOG. Осторожно! Уровни серьезности от 20 до 25 считаются неустранимыми. Если обнаруживается неустранимый уровень серьезности, то после получения сообщения соединение с клиентом обрывается и регистрируется сообщение об ошибке в журналах приложений и ошибок. для ODBC гарантированно управление возвращается клиенту при severity=16 ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2008, 15:20 |
|
DataWindow (на Stored Procedure) + MS SQL 2000 и обработка RAISERROR
|
|||
---|---|---|---|
#18+
Локшин Марк wrote: > Не выдает потому, что никогда не возникают? Ну, конечно, глюки могут быть, но я их исправляю ;). Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2008, 15:35 |
|
DataWindow (на Stored Procedure) + MS SQL 2000 и обработка RAISERROR
|
|||
---|---|---|---|
#18+
Попробовал ошибку с уровнем 19 (в серверный лог записалась!), больше не стал, на результат не влияет, Билдер ее не выводит. Так что похоже дело не в этом. А вообще, я не знаю людей, которые бы пользовались этими severity ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2008, 15:52 |
|
DataWindow (на Stored Procedure) + MS SQL 2000 и обработка RAISERROR
|
|||
---|---|---|---|
#18+
ошибка в приведенном мной выше примере: вместо "if itr_object.SQLDBCode > 0 then " должно быть "if SQLDBCode > 0 then " Пока остановился на этом ... ужастно конечно ... ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2008, 15:53 |
|
DataWindow (на Stored Procedure) + MS SQL 2000 и обработка RAISERROR
|
|||
---|---|---|---|
#18+
PB 9.0.1, работаем через ODBC, процедура в случае ошибки делает: RAISERROR(@Err_Mes, 16, -1) и в PB этот message прекрасно отображается. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2008, 16:41 |
|
DataWindow (на Stored Procedure) + MS SQL 2000 и обработка RAISERROR
|
|||
---|---|---|---|
#18+
edmikecaPB 9.0.1, работаем через ODBC, процедура в случае ошибки делает: RAISERROR(@Err_Mes, 16, -1) и в PB этот message прекрасно отображается. Как я уже оговорился мы не пользуемся северити и сервер по умолчанию выставляет 16, так что что у меня, что у Вас вызов ошибки равноценен. ODBC непримлима для работы ... даже обсуждать не хочется ... удивляюсь, что еще кто то пользуется пободного рода соединениями с базой. Я попробовал северити 19 и результат тот же (я писал). Если выставить выше, то в случае ошибки сервер разорвет соединение(!), что просто неприемлимо - это обычная рядовая ситуация. Так что даже если гипотетически представить, что Билдер вернет мне сообщение об ошибке с уровнем от 20, то смысла в его выводе и обработки мне никакого, поскольку на этом приложение разрывает связь с сервером и в итоге приложение закрывается .... а надо то всего навсего сообщить о невозможности получения отчета в данный период (после ряда действий другого менеджера не закрывая приложения данный менеджер выполнит повторное нажатие кнопки получить и отчет будет доступен). Так что не severity дело. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2008, 17:17 |
|
DataWindow (на Stored Procedure) + MS SQL 2000 и обработка RAISERROR
|
|||
---|---|---|---|
#18+
Ну и конечно прошу обратить на мою версию Билдера (см. первый пост .... возможно дело только в этом) ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2008, 17:19 |
|
DataWindow (на Stored Procedure) + MS SQL 2000 и обработка RAISERROR
|
|||
---|---|---|---|
#18+
PavelBuilderНу и конечно прошу обратить на мою версию Билдера (см. первый пост .... возможно дело только в этом) скорее всего ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2008, 17:57 |
|
DataWindow (на Stored Procedure) + MS SQL 2000 и обработка RAISERROR
|
|||
---|---|---|---|
#18+
PavelBuilderНу и конечно прошу обратить на мою версию Билдера (см. первый пост .... возможно дело только в этом)Да, я не обратил внимание на Вашу версию PB. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2008, 18:02 |
|
DataWindow (на Stored Procedure) + MS SQL 2000 и обработка RAISERROR
|
|||
---|---|---|---|
#18+
Отписал баг в Sybase, уже ответили, что проблемой занимаются и свяжутся со мной позднее. Ну что ж я буду только рад, если помогут. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2008, 20:30 |
|
DataWindow (на Stored Procedure) + MS SQL 2000 и обработка RAISERROR
|
|||
---|---|---|---|
#18+
Проблема разрешилась: Во-первых нужно было следить чтобы резалтсет возвращался всегда, даже в случае ошибки: потому приведенный мой пример процедуры должен иметь следующий код: Код: plaintext 1. 2. 3. 4.
Во-вторых: нельзя устанавливать на клиенте "SET NOCOUNT ON" иначе даже выполнив пункт первый ошибка останется. В программе выставили этот SET по совету админа, а вышло оно боком вот так. Похоже Билдер использует инфу о количестве обработаных строк, что ему возвращает сервер, а в случае SET NOCOUNT ON этого не происходит. Примечательно что на 6.5 версии не требуется выполнение первого пункта, насчет второго не скажу (проверяли только в дизайн-тайме) Так что имейте ввиду, может кому пригодится ... ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2008, 20:41 |
|
DataWindow (на Stored Procedure) + MS SQL 2000 и обработка RAISERROR
|
|||
---|---|---|---|
#18+
PavelBuilderПримечательно что на 6.5 версии не требуется выполнение первого пункта, насчет второго не скажу (проверяли только в дизайн-тайме) Так что имейте ввиду, может кому пригодится ... Про первый пункт я Вам советовал :). А вообще должно работать и без NO COUNT и без возвращения result set'а. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.02.2008, 21:20 |
|
|
start [/forum/topic.php?fid=15&fpage=27&tid=1336009]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
41ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
87ms |
get tp. blocked users: |
2ms |
others: | 317ms |
total: | 490ms |
0 / 0 |