"Dmitry Voroshin" ...
>
>
> "Dmitry Voroshin" ...
>
> Вношу поправку. Надо так.
>
> 1. Выполняем select * from RDB$DATABASE for update
> 2. создаём кусор ну скажем cur1 для этого статемента
> (isc_dsql_set_cursor_name)
> 3. препарируем запрос update RDB$DATABASE SET RDB$DESCRIPTION = 1 where
> current of cur1
> 4. Закрваем 1 статемент isc_dsql_free_statement(, , DSQL_close) но
> оставляем препарированным.
> 5. Снова выполняем статемент 1 (препарированный).
Здесь у тебя в тесте немного не так :
vdaIBSQLSelect.Close;
тут действительно вызывается isc_dsql_free_statement(... DSQL_close)
vdaIBSQLSelect.SQL.Text:='select * from RDB$DATABASE for update';
а вот тут вызывается isc_dsql_free_statement(... DSQL_drop) , т.к.
текст запроса менялся. См TIBSQL.SQLChanging
vdaIBSQLSelect.ExecQuery;
> 6. Выполняем препарированный запрос из пункта 3 (update RDB$DATABASE SET
> RDB$DESCRIPTION = 1 where current of cur1 ).
А тут действительно бага живет - этот запрос зависит от того, который
определял курсор и который уже дропнут. Вот оно и валится при попытке
работать с дохлым курсором. Самое кривое здесь то, что юные гении в
одной известной компании пометили запрос как невалидный, когда дропали
главный запрос (с курсором) - но флаг этот больше нигде не проверяется !
В 2-ке исправим, но в 1.5.х (и раньше) с этим придётся жить...
--
Хорсун Влад
PS Если запрос с курсором не дропать, а просто переоткрывать, то всё вроде
работает нормально.