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