Гость
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Застрявший result в SQLCA / 18 сообщений из 18, страница 1 из 1
01.07.2005, 11:39
    #33144593
Гость1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Застрявший result в SQLCA
День добрый.

С помощью Execute Immediate отправляю на сервер команду "Drop Table #tmp"
Сервер возвращает ошибку - нет такой таблицы. Ну нет - и ладно.
Отправляю следующую команду - "Create Table #tmp (field1 Int)", а в ответ "Attempt to initiate a new SQL Server operation with results pending."
Я так понял, что вторая ошибка возникает из-за того, что никак не обработана первая.
Что нужно следать, чтобы вторая команда прошла??
...
Рейтинг: 0 / 0
01.07.2005, 12:34
    #33144788
Ikar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Застрявший result в SQLCA
Вопрос № 1: СУБД?
Вопрос № 2: Версия РВ?

Предположение: COMMIT / ROLLBACK ?
---
С уважением, IKAR

ikarhomecenter@narod.ru
IkarHomeCenter
...
Рейтинг: 0 / 0
01.07.2005, 12:47
    #33144835
Гость1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Застрявший result в SQLCA
Сори.

СУБД - MS SQL 2000 SP3
PB - 9

Commit/Rollback в данном случае не использую. Autocommit выставлен в True
...
Рейтинг: 0 / 0
01.07.2005, 12:53
    #33144852
Black Savage
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Застрявший result в SQLCA
У нас после коннекта к базе сразу выполняется:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
execute immediate 'SET QUOTED_IDENTIFIER OFF'; 
execute immediate 'set implicit_transactions off';
execute immediate 'set cursor_close_on_commit off ';
execute immediate 'set ansi_warnings off ';
execute immediate 'set ansi_padding off ';
execute immediate 'set ansi_nulls off ';
execute immediate 'set concat_null_yields_null off ';
execute immediate 'set language русский ';
execute immediate 'set dateformat dmy ';
execute immediate 'set datefirst 1';

Может строка с padding тебе как раз и поможет?
...
Рейтинг: 0 / 0
01.07.2005, 13:54
    #33145070
Гость1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Застрявший result в SQLCA
Хм... На сервере в свойствах Connection ansi_padding и так стоит "off". Не пойму, причем здесь это??
...
Рейтинг: 0 / 0
01.07.2005, 16:16
    #33145535
ЗоринАндрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Застрявший result в SQLCA
странно это.
дроп по идее никаких result повисших не должен давать.
можно посмотреть профайлером что там на самом деле делается?
а драйвер какой? MSS?
...
Рейтинг: 0 / 0
01.07.2005, 17:02
    #33145685
Гость1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Застрявший result в SQLCA
Драйвер MSS.
Profiler показывает команду "Drop Table #tmp" и все.
Вторая команда (которая "Create Table #tmp...") в нем вообще не отсвечивает.
Ситуация, по-моему, похожа на недофетченный курсор (когда в SQLCA висит resultset), только вот как его дофетчить :-))
...
Рейтинг: 0 / 0
01.07.2005, 17:08
    #33145699
Гость1
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Застрявший result в SQLCA
Какая-то ботва.
Сделал новое "голое" приложение с окном и одной кнопкой - там такая ситуация проходит "на ура".
Ваще непонятно, блин...
...
Рейтинг: 0 / 0
01.07.2005, 17:32
    #33145770
ЗоринАндрей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Застрявший result в SQLCA
Ну значит надо смотреть что там было в профайлере до дропа. Кто-то все-таки оставил висячий result.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
19.02.2014, 15:57
    #38566373
Raven A
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Застрявший result в SQLCA
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.
CREATE PROCEDURE dbo.xp_test_raiseeror AS
BEGIN
    RAISERROR 35001 '{RaisError message from procedure.}'
    SELECT f_stub = cast( 'Var IV. empty string' AS varchar(50) )
END



в тексте 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.
Пока просто поставил "заплату", но на будущее очень хочется найти решение.
...
Рейтинг: 0 / 0
19.02.2014, 17:53
    #38566608
Локшин Марк
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Застрявший result в SQLCA
Raven A,

У Вас похоже не прерывается хранимая процедура из-за низкого уровня ошибки. Поменяйте его на более высокий для прерывания процедуры, если это желаемое поведение.
...
Рейтинг: 0 / 0
20.02.2014, 11:40
    #38567250
Raven A
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Застрявший result в SQLCA
Вы правы, Марк.

"Заплата" и есть безусловное прерывание процедуры после RAISERROR, правда "топорным" RETURN'ом а не игрой с уровнем ошибки.
Однако проблема с 1+ возвращаемым результатом остаётся, пусть и как "академическая" - вероятность повторения не нулевая
(иногда попадается такой "код", что ... эхо долго повторяет ... ать ).
Поэтому и хотелось заранее отработать стандартное решение.

Спасибо за ответ.
...
Рейтинг: 0 / 0
21.02.2014, 02:18
    #38568242
VFl
VFl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Застрявший result в SQLCA
Raven A,

после RAISERROR у вас идет SELECT, который по надо вытаскивать через FETCH в коде. Т.е. в данном случае даже если EXECUTE была с ошибкой (от RAISERROR), надо делать FETCH INTO :localevariable ; и только после этого закрывать процедуру.
...
Рейтинг: 0 / 0
21.02.2014, 11:37
    #38568582
Raven A
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Застрявший result в SQLCA
VFI
Я готов с благодарностью последовать вашему совету, если Вы поясните FETCH чего я должен делать, если вызов процедуры
идёт через EXECUTE IMMEDIATE '...' ( ну или через dw.SyntaxFromSQL() ) ?
...
Рейтинг: 0 / 0
21.02.2014, 19:11
    #38569095
VFl
VFl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Застрявший result в SQLCA
Raven A,

большого смысла в вызове процедуры через EXECUTE IMMEDIATE не вижу, но раз там у вас используется строка с SQL, то можно ее использовать так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
string Emp_state_var
string sql

sql = "execute dbo.xp_test_raiseeror @parm=1234567, @parm2='wasweissich'"

DECLARE my_proc DYNAMIC PROCEDURE FOR SQLSA ;

PREPARE SQLSA FROM  :sql ;

EXECUTE DYNAMIC my_proc USING :Emp_state_var ;

FETCH my_proc INTO :Emp_state_var ;

CLOSE my_proc ;
...
Рейтинг: 0 / 0
21.02.2014, 19:15
    #38569097
VFl
VFl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Застрявший result в SQLCA
VFlRaven A,

большого смысла в вызове процедуры через EXECUTE IMMEDIATE не вижу, но раз там у вас используется строка с SQL, то можно ее использовать так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
string Emp_state_var
string sql

sql = "execute dbo.xp_test_raiseeror @parm=1234567, @parm2='wasweissich'"

DECLARE my_proc DYNAMIC PROCEDURE FOR SQLSA ;

PREPARE SQLSA FROM  :sql ;

EXECUTE DYNAMIC my_proc USING :Emp_state_var ;

FETCH my_proc INTO :Emp_state_var ;

CLOSE my_proc ;





Вот так правильно, извиняюсь:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
string Emp_state_var
string sql

sql = "execute dbo.xp_test_raiseeror @parm=1234567, @parm2='wasweissich'"

DECLARE my_proc DYNAMIC PROCEDURE FOR SQLSA ;

PREPARE SQLSA FROM  :sql ;

EXECUTE DYNAMIC my_proc ;

FETCH my_proc INTO :Emp_state_var ;

CLOSE my_proc ;
...
Рейтинг: 0 / 0
22.02.2014, 00:18
    #38569231
Raven A
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Застрявший result в SQLCA
VFI

На мой взгляд, Вы просто не совсем поняли поставленную задачу. Вопрос был как прибить 1+ ResultSet а не как прочитать заранее известный ResultSet.
Как рабочий пример: Построить DW по строке вызова процедуры. В процедуре есть приведенная мною последовательность.
Тело процедуры или неизвестно или не подлежит модификации.

P.S.
BTW, "большого смысла ... не вижу" в копировании кода, проще было привести ссылку на "Dynamic SQL Format 3 SQL statement"
P.P.S.
Format 4 не предлагать. :)
...
Рейтинг: 0 / 0
22.02.2014, 03:01
    #38569265
VFl
VFl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Застрявший result в SQLCA
Мне было скучно, так что получилось длинно, извиняйте :)

Raven AVFI

На мой взгляд, Вы просто не совсем поняли поставленную задачу. Вопрос был как прибить 1+ ResultSet а не как прочитать заранее известный ResultSet.


На мой взгляд, я ответил на ваш вопрос. Если вы не знаете, что какие поля возвращает/может возвращать в случае ошибки процедура, это исключительно ваши личные проблемы. Ну или используйте Dynamic SQL Format 4 SQL statement. Если знаете - делайте FETCH и будет вам счастье. Если вы не знаете, сколько строк может вернуть процедура, делать надо так:
Код: sql
1.
2.
3.
4.
5.
6.
FETCH my_proc INTO :Emp_state_var ;
DO WHILE SQLCA.SQLCode = 0

	FETCH my_proc INTO :Emp_state_var ;

LOOP



Может случиться, что процедура возвращает множество ResultSet. Допустим, там стоит
SELECT 1
SELECT 2
SELECT 3
Тогда делать надо так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
FETCH my_proc INTO :Emp_state_var ;
DO WHILE SQLCA.SQLCode = 0

	DO WHILE SQLCA.SQLCode = 0 // Вытягивание одного ResultSet 

		FETCH my_proc INTO :Emp_state_var ;
		// Его обработка
	LOOP
	FETCH my_proc INTO :Emp_state_var2 ; // Переход к следующему или завершение
LOOP
 





Raven AКак рабочий пример: Построить DW по строке вызова процедуры. В процедуре есть приведенная мною последовательность.
Тело процедуры или неизвестно или не подлежит модификации.


Попробовал. Исхожу из того, что раз вы делаете DW, значит процедура в нормальном случае что то возвращает. Сделаем модификацию вашего примера:

Код: sql
1.
2.
3.
4.
5.
6.
7.
ALTER PROCEDURE [dbo].[xp_test_raiseeror] AS
BEGIN
	SELECT 1, 2, 3

	RAISERROR 35001 '{RaisError message from procedure.}'
	SELECT f_stub = cast( 'Var IV. empty string' AS varchar(50) )
END



Код: 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	lds_datawindow
string	err, dwsyntax_str
long	ll_return

dwsyntax_str = SQLCA.SyntaxFromSQL ( "exec dbo.xp_test_raiseeror", "style(type=grid)", err )

IF Len(err) > 0 THEN

   MessageBox("Caution", "SyntaxFromSQL caused these errors: " + err)

   RETURN

END IF

lds_datawindow = dw_2 // Это datawindow в окне

lds_datawindow.create(dwsyntax_str, err)

IF Len(err) > 0 THEN

   MessageBox("Caution", "create caused these errors: " + err)

   RETURN

END IF

lds_datawindow.settransobject( SQLCA)

ll_return = lds_datawindow.retrieve()

if ll_return < 0 then
	
	Msgbox("ERROR Retrieve")  // никогда не случалось, в окне видно, что данные поступают
	
end if

// Проверка утверждения "При следующих любых обращения по коннекту:
// SQLCA.SQLErrText: Microsoft OLE DB Provider for SQL Server. Attempt to initiate a new SQL Server operation with results pending."

EXECUTE IMMEDIATE "SELECT 0" ; 

Msgbox(SQLCA.SQLErrText)  // SQLCA.SQLErrText чист всегда как душа ребенка.



По итогам теста - никаких проблем при работе с DataWindow вообще никогда не возникает. Сколько бы раз вы не нажимали на button.

Изменим процедуру для симуляции случайной ошибки:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
ALTER PROCEDURE [dbo].[xp_test_raiseeror]
AS
BEGIN
if rand() > 0.5 
	GOTO ERROR
SELECT 1, 2, 3

ERROR:
    RAISERROR 35001 '{RaisError message from procedure.}'
    SELECT f_stub = cast( 'Var IV. empty string' AS varchar(50) )
END



После многочисленых тестов ошибка выскакивала либо при SyntaxFromSQL, либо при retrieve, либо вообще не выскакивала. Но в любом случае описаных вами проблем с "зависанием 1+ ResultSet" и последующих ошибках в SQLCA.SQLErrText не было вообще.

Вывод - описаная ситуация не имеет отношения к SyntaxFromSQL . Проверил EXECUTE IMMEDIATE:

Код: sql
1.
2.
3.
4.
EXECUTE IMMEDIATE "exec dbo.xp_test_raiseeror" ; 
EXECUTE IMMEDIATE "SELECT 0" ; 

Msgbox(SQLCA.SQLErrText)




Тоже самое, никаких проблем. Попробовал то же самое с трансакцией - опять никаких проблем. Наверно я правда чего то не понял :)


P.S. Опс, я опять местами использовал код из hilfe.
P.P.S. Как давать ссылку на hilfe в PowerBuilder не знаю. Но считаю давание ссылок плохим тоном, только если там так много, что не поместится в ответ.
...
Рейтинг: 0 / 0
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Застрявший result в SQLCA / 18 сообщений из 18, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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