C++ Firebird C客户端API:语句、事务和游标生命周期
上下文:Firebird 2.5,C客户端API 我想了解语句、事务和游标对象的生命周期。以下是我的工作(伪代码):C++ Firebird C客户端API:语句、事务和游标生命周期,c++,firebird,C++,Firebird,上下文:Firebird 2.5,C客户端API 我想了解语句、事务和游标对象的生命周期。以下是我的工作(伪代码): 调用isc\u dsql\u free\u语句只是为了关闭光标?语句保持有效,我可以使用不同的输入反复调用执行?isc\u dsql\u free\u语句的功能取决于第三个参数。有三个有效值(另请参见Interbase 6.0 API指南和Firebird 2.5发行说明): DSQL\u close:关闭打开的游标(如果有),但保留当前语句,句柄保持有效 DSQL\u drop
调用
isc\u dsql\u free\u语句
只是为了关闭光标?语句保持有效,我可以使用不同的输入反复调用执行?isc\u dsql\u free\u语句的功能取决于第三个参数。有三个有效值(另请参见Interbase 6.0 API指南和Firebird 2.5发行说明):
DSQL\u close
:关闭打开的游标(如果有),但保留当前语句,句柄保持有效
DSQL\u drop
:关闭打开的游标(如果有),取消准备当前语句并删除语句句柄
(在Firebird 2.5中添加):关闭打开的游标(如果有),取消对当前语句的准备,但句柄本身仍然有效
在代码中使用isc_dsql_free_语句(status,&_语句,dsql_close)代码>表示光标已关闭(如果有),当前语句保持准备状态并可以再次执行(或者您可以在此句柄上准备另一个语句)。您的问题太广泛,请坚持每个问题一个问题。我强烈建议您编辑此问题,使其仅涉及一件事,并针对其他两件事发布附加问题。如果主题是相关的,那么你可以在问题之间建立链接。我已经冒昧地从你的帖子中删除了另外两个问题。请为他们单独发布问题。谢谢您的回答。实际上,我再次阅读了Interbase API指南,发现了关于DSQL_drop的内容。至于DSQL_unprepare,用例会是什么?@SoyonsPrecis它会取消语句的准备,释放元数据对象上的所有锁(否则会阻止某些DDL操作),但使句柄可以重用(例如对于语句句柄池或类似的东西)。我认为这确实是一个边缘案件。
class Query {
isc_tr_handle _transaction;
isc_stmt_handle _statement;
XSQLDA* _in_sqlda;
XSQLDA* _out_sqlda;
void prepare(){
isc_dsql_allocate_statement(...,&_statement,...);
isc_dsql_prepare(&_transaction, &_statement);
}
void execute(Input* input, Output* output) {
... copy input to _in_sqlda
isc_dsql_set_cursor_name(status, &_statement, Name(), NULL);
isc_dsql_execute(status, &_transaction, &_statement, 1, in_sqlda);
while(fetch()) {
... copy _out_sqlda to output
}
isc_dsql_free_statement(status, &_statement, DSQL_close);
}
void commit() { isc_commit_transaction(status, &_transaction); }
};