Mar*_*tin 2 c++ sql sqlite select
interweb上有一百万个示例,详细说明了使用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;
}
Run Code Online (Sandbox Code Playgroud)
这是实现的代码callback:
[...]
rc = sqlite3_exec(db, sql, callback, &nrecs, &zErrMsg);
[...]
Run Code Online (Sandbox Code Playgroud)
现在,我认为将获取的数据用于除打印之外的其他内容将是一个相当标准的场景,但对于我的生活,我无法找到应该如何实现.
我想要做的是获取argc包含两列的一行(将是1),argv[0]并argv[1]从sqlite3_exec执行的位置访问这两个值(和).
我想这与这个问题有关void *NotUsed.(世界上这是一个指针,为什么所有的例子都坚持不使用它?)
如果有人可以帮助我,我会非常感激.如果你还能向我解释为什么这个看似微不足道的任务变得如此复杂,你将拥有我永恒的爱.(获取的数据在从另一个函数调用的静态函数中处理.这有效地杀死了使用面向对象语言的目的,对吧?)
'key'是sqlite3_exec的第四个参数.
通常情况是这样的:你有这个结构,你不能用sqlite查询填写:
struct xyz_t
{
int a ;
int b ;
} ;
Run Code Online (Sandbox Code Playgroud)
然后你像这样调用sqlite3_exec:
//fill in query text
xyz_t xyz; // struct you want to fill
sqlite3_exec(db, sql, callback, &xyz, &zErrMsg);
Run Code Online (Sandbox Code Playgroud)
回调就是这样做的:
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;
}
Run Code Online (Sandbox Code Playgroud)
你甚至可以在每次调用时传递std :: vector和push_back一个新的xyz_t.不适合C++程序员,但这是一个混合的C/C++世界......
| 归档时间: |
|
| 查看次数: |
2609 次 |
| 最近记录: |