|
Застрявший result в SQLCA
|
|||
---|---|---|---|
#18+
День добрый. С помощью Execute Immediate отправляю на сервер команду "Drop Table #tmp" Сервер возвращает ошибку - нет такой таблицы. Ну нет - и ладно. Отправляю следующую команду - "Create Table #tmp (field1 Int)", а в ответ "Attempt to initiate a new SQL Server operation with results pending." Я так понял, что вторая ошибка возникает из-за того, что никак не обработана первая. Что нужно следать, чтобы вторая команда прошла?? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2005, 11:39 |
|
Застрявший result в SQLCA
|
|||
---|---|---|---|
#18+
Вопрос № 1: СУБД? Вопрос № 2: Версия РВ? Предположение: COMMIT / ROLLBACK ? --- С уважением, IKAR ikarhomecenter@narod.ru IkarHomeCenter ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2005, 12:34 |
|
Застрявший result в SQLCA
|
|||
---|---|---|---|
#18+
Сори. СУБД - MS SQL 2000 SP3 PB - 9 Commit/Rollback в данном случае не использую. Autocommit выставлен в True ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2005, 12:47 |
|
Застрявший result в SQLCA
|
|||
---|---|---|---|
#18+
У нас после коннекта к базе сразу выполняется: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Может строка с padding тебе как раз и поможет? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2005, 12:53 |
|
Застрявший result в SQLCA
|
|||
---|---|---|---|
#18+
Хм... На сервере в свойствах Connection ansi_padding и так стоит "off". Не пойму, причем здесь это?? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2005, 13:54 |
|
Застрявший result в SQLCA
|
|||
---|---|---|---|
#18+
странно это. дроп по идее никаких result повисших не должен давать. можно посмотреть профайлером что там на самом деле делается? а драйвер какой? MSS? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2005, 16:16 |
|
Застрявший result в SQLCA
|
|||
---|---|---|---|
#18+
Драйвер MSS. Profiler показывает команду "Drop Table #tmp" и все. Вторая команда (которая "Create Table #tmp...") в нем вообще не отсвечивает. Ситуация, по-моему, похожа на недофетченный курсор (когда в SQLCA висит resultset), только вот как его дофетчить :-)) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2005, 17:02 |
|
Застрявший result в SQLCA
|
|||
---|---|---|---|
#18+
Какая-то ботва. Сделал новое "голое" приложение с окном и одной кнопкой - там такая ситуация проходит "на ура". Ваще непонятно, блин... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2005, 17:08 |
|
Застрявший result в SQLCA
|
|||
---|---|---|---|
#18+
Ну значит надо смотреть что там было в профайлере до дропа. Кто-то все-таки оставил висячий result. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.07.2005, 17:32 |
|
Застрявший result в SQLCA
|
|||
---|---|---|---|
#18+
Hi, Коллеги. Не очень удобно чувствовать себя некромансером, но ... MSSQL 2008 R2 (SP2) - 10.50.4000.0 (X64) PB 9.0.3 8836 connect - OLE DB ( PROVIDER='SQLOLEDB' ) Вот подкинули "наследие". Есть хранимка, тело которой в "сухом остатке" такое: Код: sql 1. 2. 3. 4. 5.
в тексте PB цикл вызовов: ... execute immediate 'dbo.xp_test_raiseeror' using SQLCA; ... При ПЕРВОМ вызове - ожидаемое поведение SQLCA.SQLErrText: Microsoft OLE DB Provider for SQL Server. {RaisError message from procedure.} При следующих любых обращения по коннекту: SQLCA.SQLErrText: Microsoft OLE DB Provider for SQL Server. Attempt to initiate a new SQL Server operation with results pending. Понятно, что где-то "висит" последний resultset, но как от него избавится, "прочистить мозги" драйверу? C "родным" MSS драйвером все Ok. Пробовал создать SyntaxFromSQL() - аналогичное поведение. DW.DBCancel() не помогает. Лезть на уровень DB-Lib ну очень не хочется, да и уверенности в победе нет. DBCancel() и CLOSE применить не к чему. Заранее спасибо за любые мысли. Хоть направление определить "куда бежать" :) P.S. Пока просто поставил "заплату", но на будущее очень хочется найти решение. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2014, 15:57 |
|
Застрявший result в SQLCA
|
|||
---|---|---|---|
#18+
Raven A, У Вас похоже не прерывается хранимая процедура из-за низкого уровня ошибки. Поменяйте его на более высокий для прерывания процедуры, если это желаемое поведение. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2014, 17:53 |
|
Застрявший result в SQLCA
|
|||
---|---|---|---|
#18+
Вы правы, Марк. "Заплата" и есть безусловное прерывание процедуры после RAISERROR, правда "топорным" RETURN'ом а не игрой с уровнем ошибки. Однако проблема с 1+ возвращаемым результатом остаётся, пусть и как "академическая" - вероятность повторения не нулевая (иногда попадается такой "код", что ... эхо долго повторяет ... ать ). Поэтому и хотелось заранее отработать стандартное решение. Спасибо за ответ. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2014, 11:40 |
|
Застрявший result в SQLCA
|
|||
---|---|---|---|
#18+
Raven A, после RAISERROR у вас идет SELECT, который по надо вытаскивать через FETCH в коде. Т.е. в данном случае даже если EXECUTE была с ошибкой (от RAISERROR), надо делать FETCH INTO :localevariable ; и только после этого закрывать процедуру. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2014, 02:18 |
|
Застрявший result в SQLCA
|
|||
---|---|---|---|
#18+
VFI Я готов с благодарностью последовать вашему совету, если Вы поясните FETCH чего я должен делать, если вызов процедуры идёт через EXECUTE IMMEDIATE '...' ( ну или через dw.SyntaxFromSQL() ) ? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2014, 11:37 |
|
Застрявший result в SQLCA
|
|||
---|---|---|---|
#18+
Raven A, большого смысла в вызове процедуры через EXECUTE IMMEDIATE не вижу, но раз там у вас используется строка с SQL, то можно ее использовать так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2014, 19:11 |
|
Застрявший result в SQLCA
|
|||
---|---|---|---|
#18+
VFlRaven A, большого смысла в вызове процедуры через EXECUTE IMMEDIATE не вижу, но раз там у вас используется строка с SQL, то можно ее использовать так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Вот так правильно, извиняюсь: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
... |
|||
:
Нравится:
Не нравится:
|
|||
21.02.2014, 19:15 |
|
Застрявший result в SQLCA
|
|||
---|---|---|---|
#18+
VFI На мой взгляд, Вы просто не совсем поняли поставленную задачу. Вопрос был как прибить 1+ ResultSet а не как прочитать заранее известный ResultSet. Как рабочий пример: Построить DW по строке вызова процедуры. В процедуре есть приведенная мною последовательность. Тело процедуры или неизвестно или не подлежит модификации. P.S. BTW, "большого смысла ... не вижу" в копировании кода, проще было привести ссылку на "Dynamic SQL Format 3 SQL statement" P.P.S. Format 4 не предлагать. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2014, 00:18 |
|
Застрявший result в SQLCA
|
|||
---|---|---|---|
#18+
Мне было скучно, так что получилось длинно, извиняйте :) Raven AVFI На мой взгляд, Вы просто не совсем поняли поставленную задачу. Вопрос был как прибить 1+ ResultSet а не как прочитать заранее известный ResultSet. На мой взгляд, я ответил на ваш вопрос. Если вы не знаете, что какие поля возвращает/может возвращать в случае ошибки процедура, это исключительно ваши личные проблемы. Ну или используйте Dynamic SQL Format 4 SQL statement. Если знаете - делайте FETCH и будет вам счастье. Если вы не знаете, сколько строк может вернуть процедура, делать надо так: Код: sql 1. 2. 3. 4. 5. 6.
Может случиться, что процедура возвращает множество ResultSet. Допустим, там стоит SELECT 1 SELECT 2 SELECT 3 Тогда делать надо так: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Raven AКак рабочий пример: Построить DW по строке вызова процедуры. В процедуре есть приведенная мною последовательность. Тело процедуры или неизвестно или не подлежит модификации. Попробовал. Исхожу из того, что раз вы делаете DW, значит процедура в нормальном случае что то возвращает. Сделаем модификацию вашего примера: Код: sql 1. 2. 3. 4. 5. 6. 7.
Код: button.click() Код: sql 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. 36. 37. 38. 39. 40. 41. 42.
По итогам теста - никаких проблем при работе с DataWindow вообще никогда не возникает. Сколько бы раз вы не нажимали на button. Изменим процедуру для симуляции случайной ошибки: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
После многочисленых тестов ошибка выскакивала либо при SyntaxFromSQL, либо при retrieve, либо вообще не выскакивала. Но в любом случае описаных вами проблем с "зависанием 1+ ResultSet" и последующих ошибках в SQLCA.SQLErrText не было вообще. Вывод - описаная ситуация не имеет отношения к SyntaxFromSQL . Проверил EXECUTE IMMEDIATE: Код: sql 1. 2. 3. 4.
Тоже самое, никаких проблем. Попробовал то же самое с трансакцией - опять никаких проблем. Наверно я правда чего то не понял :) P.S. Опс, я опять местами использовал код из hilfe. P.P.S. Как давать ссылку на hilfe в PowerBuilder не знаю. Но считаю давание ссылок плохим тоном, только если там так много, что не поместится в ответ. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.02.2014, 03:01 |
|
|
start [/forum/search_topic.php?author=silnov&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
get settings: |
12ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
163ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
others: | 606ms |
total: | 904ms |
0 / 0 |