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 发行说明):

  1. DSQL_close: 关闭打开的游标(如果有的话),但保留当前语句并句柄保持有效。
  2. DSQL_drop:关闭打开的游标(如果有),取消准备当前语句并删除语句句柄。
  3. DSQL_unprepare(在 Firebird 2.5 中添加):关闭打开的游标(如果有),取消准备当前语句,但句柄本身仍然有效。

在您的代码中您使用 isc_dsql_free_statement(status, &_statement, DSQL_close); 这意味着游标已关闭(如果有的话),当前语句保持准备状态并可以再次执行(或者您可以在此句柄上准备另一个语句)。