如何使用sqlite3_exec将sqlite3数据库中的数据选择为变量
How do I select data from an sqlite3 database into variables using sqlite3_exec?
互联网上有一百万个例子详细介绍了使用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++世界。。。
相关文章:
- 防止主数据类型C++的隐式转换
- 用于访问容器<T>数据成员的正确 API
- 嵌套在类中时无法设置成员数据
- 使用流处理接收到的数据
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在cuda线程之间共享大量常量数据
- C++将文本文件中的数据读取到结构数组中
- 如何在C++中序列化结构数据
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 在c代码之间共享数据的最佳方式
- 打印从SQLite3数据库检索的数据C++与命令行中相同的方式
- 使用 sqlite3 和 C++ 绑定和返回文本数据
- C++在 ActiveDirectory 和 Sqlite3 之间复制文本数据时出现问题
- 无法使用sqlite3数据库表的所有行中的数据填充列表,错误:跟踪/断点陷阱(核心转储)
- 如何使用Visual C++将UTF-8编码的数据存储到sqlite3中
- Sqlite3将数据转换成短数组
- 如何从sqlite3中获取数据而不使用while 1和if
- 如何使用sqlite3_exec将sqlite3数据库中的数据选择为变量