"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    Если запрос с курсором не дропать, а просто переоткрывать, то всё вроде
работает нормально.


Ответить