C++ 未调用sqlite3_exec回调

C++ 未调用sqlite3_exec回调,c++,sqlite,callback,C++,Sqlite,Callback,在创建表之前,我必须通过读取来检查表是否存在 ,我使用sqlite3_exec对 从sqlite_master中选择名称,其中type='table'和name =‘表1’ 并使用回调设置标志来标识表是否存在。 不幸的是,如果尚未创建表,则不会调用回调 为什么不调用回调?我知道,对于没有输出结果的查询(例如创建表等),不会调用回调,而只会使用SELECT查询调用回调。但我不知道它甚至可能不会被称为SELECT 下面是重现该问题的代码示例 #include <stdio.h> #inc

在创建表之前,我必须通过读取来检查表是否存在 ,我使用sqlite3_exec对

从sqlite_master中选择名称,其中type='table'和name =‘表1’

并使用回调设置标志来标识表是否存在。 不幸的是,如果尚未创建表,则不会调用回调

为什么不调用回调?我知道,对于没有输出结果的查询(例如创建表等),不会调用回调,而只会使用SELECT查询调用回调。但我不知道它甚至可能不会被称为SELECT

下面是重现该问题的代码示例

#include <stdio.h>
#include <sqlite3.h>

bool isExist=false;
static int callback(void *NotUsed, int argc, char **argv, char **azColName){      
  printf("I am being called\n");
  if (argc>0) isExist = true;
  return 0;
}

int main(int argc, char **argv){
  sqlite3 *db;
  char *zErrMsg = 0;
  int rc;

  rc = sqlite3_open("test.db", &db);
  if( rc ){
    fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
    sqlite3_close(db);
    return(1);
  }

  //char* sqlCreateTable = "CREATE TABLE table1(name TEXT);";
  //rc = sqlite3_exec(db, sqlCreateTable, callback, 0, &zErrMsg);

  // callback will not be called if table is not yet created
  char* sql_hasTable = "SELECT name FROM sqlite_master WHERE type = 'table' AND name ='table1';";
  rc = sqlite3_exec(db, sql_hasTable, callback, 0, &zErrMsg);
  if( rc!=SQLITE_OK ){
    fprintf(stderr, "SQL error: %s\n", zErrMsg);
    sqlite3_free(zErrMsg);
  }
  sqlite3_close(db);
  return 0;
}

只有在存在有效返回时,才会调用sqlite3中select的回调函数。至少有一个结果。如果该表不存在,那么该查询中缺少结果也不应该是意外的。创建表,然后运行该查询并查看回调是否被命中。我很想让您看看文档,其中说明了[edit]sqlite3_exec[/edit]在零返回条件下的行为,但我在指定的搜索时间内找不到它。这是API文档:如果表是在之前创建的,那么将调用回调。0结果也是一个有效的返回。否?我猜是否。因为exec处理所有sql语句,所以它可能只在至少有1个有效结果时执行回调。如上所述,API文档没有指定一种或另一种方式。因此,您必须从表面上看观察到的行为。如果不存在CREATETABLE,为什么不使用CREATETABLE呢