c++获取sqlite3 select 结果的值
如果,我是用原生的api查询,然后有个callbackone回调函数,我想在回调函数中把取得的值传给全局函数backone,但试了backone=*argv[0];,ba...
如果,我是用原生的api 查询,然后有个callbackone 回调函数,我想在回调函数中把取得的值传给全局函数backone,但 试了 backone= * argv[0]; , backone= *(char *) argv[0]; 都不能得到正确的值。
问题一,如何让backone得到 结果的值(只有一条)。 问题二,这种设计很不方便,当要取得多个查询语句的值时,要分别字义多个函数和全局变量,请问有其它更方便的方法吗?
char backone;
static int callbackone(void *NotUsed, int argc, char **argv, char **azColName)
{
printf(argv[0]);
backone= * argv[0];
return 0;
}
int main(int argc, char* argv[])
{
.....some connect code ....
char q2[1024];
sprintf(q2,"select id from keywords where short_name='yun' limit 1")
ret = sqlite3_exec(db, q2, callbackone, 0, &errmsg);
if( ret!=SQLITE_OK ){
fprintf(stderr, "SQL error: %s\n", errmsg);
sqlite3_free(errmsg);
}
char q1[1024];
lastid=(int) ( backone);
sprintf(q1,"update meta set tid=%i where id=3",lastid);
.........
} 展开
问题一,如何让backone得到 结果的值(只有一条)。 问题二,这种设计很不方便,当要取得多个查询语句的值时,要分别字义多个函数和全局变量,请问有其它更方便的方法吗?
char backone;
static int callbackone(void *NotUsed, int argc, char **argv, char **azColName)
{
printf(argv[0]);
backone= * argv[0];
return 0;
}
int main(int argc, char* argv[])
{
.....some connect code ....
char q2[1024];
sprintf(q2,"select id from keywords where short_name='yun' limit 1")
ret = sqlite3_exec(db, q2, callbackone, 0, &errmsg);
if( ret!=SQLITE_OK ){
fprintf(stderr, "SQL error: %s\n", errmsg);
sqlite3_free(errmsg);
}
char q1[1024];
lastid=(int) ( backone);
sprintf(q1,"update meta set tid=%i where id=3",lastid);
.........
} 展开
2个回答
展开全部
一般回调函数都设一个参数位 ,把全局变量指针传进去,然后修改其值
sqlite3_exec(db,
q2,
callbackone,
&backone, //就是这个位置,
&errmsg);
如果你传递的参数很多.可以设一个结构体.然后把结构体指针传递进去.
追问
具体代码怎么写呢? 能写个callbackone的样例吗? 因为刚学c语言,所以对指针和地址应用很模糊。
追答
//首先要确定 一下你写的是纯C,还是C++,两种代码风格不太一样的.下面 是纯C,因为可以在C++里使用.而C++不能在纯c中使用
struct tmp{
int a;
int b;
int c;
char d[200];
}
void main(int argc, char* argv[])
{
/*
*
*你的代码
*/
struct tmp a; //创建结构体
a.a=4; //结构体元素的赋值
a.b=5;
a.c=6;
d="不知道你是谁,我是47979256"
sqlite3_exec(db, //调用你的函数
q2,
callbackone, //回调函数的名字
(char *) &a, //就是这个位置, 传递参数位置把你的结构体取址再强制为char*
&errmsg);
}
static int callbackone(void *NotUsed, int argc, char **argv, char **azColName)
{
struct tmp *tm=(tmp*)NotUsed;
/*
*你的代码与计算.
*
*/
//传回参数
tm->a=123;
tm->b=123;
tm->c=123;
tm->d="有事可加我Q问~";
return 0;
}
展开全部
这样callback确实我也不喜欢
用sqlite3_prepare、sqlite3_step、sqlite3_column_xxxx、sqlite3_finalize 这一套函数
第一个用于送入sql语句,得到一个sqlite3_stmt对象
第二个用于从这个语句获取一条记录,每次调用都可以获取到一条数据,然后第三个用于获取这一条记录的数据(调用一次获取一个列上的数据),最后一个用于销毁sqlite3_stmt对象。
总体结构大概是这样
sqlite3_prepare
while( sqlite3_step == SQLITE_ROW ) {
sqlite3_column_xxx
sqlite3_column_xxx
...
}
sqlite3_finalize
用sqlite3_prepare、sqlite3_step、sqlite3_column_xxxx、sqlite3_finalize 这一套函数
第一个用于送入sql语句,得到一个sqlite3_stmt对象
第二个用于从这个语句获取一条记录,每次调用都可以获取到一条数据,然后第三个用于获取这一条记录的数据(调用一次获取一个列上的数据),最后一个用于销毁sqlite3_stmt对象。
总体结构大概是这样
sqlite3_prepare
while( sqlite3_step == SQLITE_ROW ) {
sqlite3_column_xxx
sqlite3_column_xxx
...
}
sqlite3_finalize
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |