【问题标题】:How do I select data from an sqlite3 database into variables using sqlite3_exec?如何使用 sqlite3_exec 将 sqlite3 数据库中的数据选择到变量中?
【发布时间】:2015-09-10 20:40:48
【问题描述】:

互联网上有上百万个示例详细说明了使用 sqlite3_exec 从表中选择行并使用此回调函数打印它们:

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

这是实现callback的代码:

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

现在,我假设将获取的数据用于打印以外的其他用途将是一个相当标准的场景,但对于我的生活,我无法找到应该如何实现这一点。

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

我想这与void *NotUsed 有关。 (这到底是什么指针,为什么所有示例都坚持不使用它?)

如果有人可以帮助我解决这个问题,我将不胜感激。如果你也可以向我解释为什么这个看似微不足道的任务会变得如此复杂,你会得到我不朽的爱。 (获取的数据在从另一个函数调用的静态函数中处理。这实际上扼杀了使用面向对象语言的目的,对吧?)

【问题讨论】:

    标签: c++ sql select sqlite


    【解决方案1】:

    '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++ 世界......

    【讨论】:

    • 这是对我的问题的完美解决方案。非常感谢!
    猜你喜欢
    • 2021-12-05
    • 2018-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-24
    • 2016-06-14
    • 1970-01-01
    相关资源
    最近更新 更多