如何使用sqlite3_exec将sqlite3数据库中的数据选择为变量

How do I select data from an sqlite3 database into variables using sqlite3_exec?

本文关键字:sqlite3 数据 选择 变量 数据库 何使用 exec      更新时间:2023-10-16

互联网上有一百万个例子详细介绍了使用sqlite3_exec从表中选择行并使用以下回调函数打印这些行:

static int callback(void *NotUsed, int argc, char **argv, char **azColName){
  int i;
  for(i=0; i<argc; i++){
    printf("%s = %sn", azColName[i], argv[i] ? argv[i] : "NULL");
  }
  printf("n");
  return 0;
}

这是实现callback:的代码

[...]
rc = sqlite3_exec(db, sql, callback, &nrecs, &zErrMsg);
[...]

现在,我认为将提取的数据用于打印之外的其他用途将是一种相当标准的场景,但就我的一生而言,我不知道应该如何实现这一点。

我想做的是获取包含两列的一行(argc将为1),并从执行sqlite3_exec的位置访问这两个值(argv[0]argv[1])。

我想这和void *NotUsed有关。(这到底指向了什么?为什么所有的例子都坚持不使用它?)

如果有人能帮我,我会非常感激的。如果你也能向我解释为什么这个看似琐碎的任务变得如此复杂,你就会得到我永恒的爱。(提取的数据在从另一个函数调用的静态函数中处理。这实际上扼杀了使用面向对象语言的目的,对吧?)

"key"是sqlite3_exec的第四个参数。

通常情况是这样的:您需要使用sqlite查询填写以下结构:

struct xyz_t
{
   int a ;
   int b ;
} ;

然后调用sqlite3_exec,如下所示:

//fill in query text
xyz_t xyz; // struct you want to fill
sqlite3_exec(db, sql, callback, &xyz, &zErrMsg);

回调是这样做的:

static int callback(void *veryUsed, int argc, char **argv, char **azColName){
  int i;
  xyz_t *xyz = (xyz_t *)veryUsed ;
  for(i=0; i<argc; i++){
    if (strcmp(azColName[i], "a") == 0)
       xyz->a = atoi(argv[1]) ;
    else if ...
  }
  return 0;
}

您甚至可以在每次调用时传递一个std::vector并push_back一个新的xyz_t。对于C++程序员来说不太好,但这是一个混合的C/C++世界。。。