C++ Firebird 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

上下文: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
    :关闭打开的游标(如果有),取消准备当前语句并删除语句句柄
  • (在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); }
    };