Firebird C 客户端 API:语句、事务和游标生命周期

Firebird C client API: statement, transaction and cursor lifecycle

本文关键字:事务 游标 生命 周期 语句 客户端 API Firebird      更新时间:2023-10-16

上下文: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 Guide 和 Firebird 2.5 发行说明):

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

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