Firebird C 客户端 API:语句、事务和游标生命周期
Firebird C client API: statement, transaction and cursor lifecycle
上下文:Firebird 2.5,C 客户端 API。
我想了解语句、事务和游标对象的生命周期。这是我所做的(伪代码):
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); }
};
调用isc_dsql_free_statement
只是为了关闭游标? statement
仍然有效,我可以用不同的输入一次又一次地执行?
isc_dsql_free_statement
的作用取决于第三个参数。共有三个有效值(另请参阅 Interbase 6.0 API 指南和 Firebird 2.5 发行说明):
DSQL_close
: 关闭打开的游标(如果有的话),但保留当前语句并句柄保持有效。
DSQL_drop
:关闭打开的游标(如果有),取消准备当前语句并删除语句句柄。
DSQL_unprepare
(在 Firebird 2.5 中添加):关闭打开的游标(如果有),取消准备当前语句,但句柄本身仍然有效。
在您的代码中您使用 isc_dsql_free_statement(status, &_statement, DSQL_close);
这意味着游标已关闭(如果有的话),当前语句保持准备状态并可以再次执行(或者您可以在此句柄上准备另一个语句)。
上下文:Firebird 2.5,C 客户端 API。
我想了解语句、事务和游标对象的生命周期。这是我所做的(伪代码):
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); }
};
调用isc_dsql_free_statement
只是为了关闭游标? statement
仍然有效,我可以用不同的输入一次又一次地执行?
isc_dsql_free_statement
的作用取决于第三个参数。共有三个有效值(另请参阅 Interbase 6.0 API 指南和 Firebird 2.5 发行说明):
DSQL_close
: 关闭打开的游标(如果有的话),但保留当前语句并句柄保持有效。DSQL_drop
:关闭打开的游标(如果有),取消准备当前语句并删除语句句柄。DSQL_unprepare
(在 Firebird 2.5 中添加):关闭打开的游标(如果有),取消准备当前语句,但句柄本身仍然有效。
在您的代码中您使用 isc_dsql_free_statement(status, &_statement, DSQL_close);
这意味着游标已关闭(如果有的话),当前语句保持准备状态并可以再次执行(或者您可以在此句柄上准备另一个语句)。