#include<stdio.h>
#include<sqlite3.h>
int callback(void *arg,int f_num,char **f_value,char **f_name)//回调
{
printf("srg %s\n",(char *)arg);
for (int i = 0; i < f_num; i++)
{
printf("%s ",f_name[i]);
}
putchar(10);
for (int i = 0; i < f_num; i++)
{
printf("%s ",f_value[i]);
}
putchar(10);
return 0;
}
int main(int argc, char const *argv[])
{
sqlite3 *db;
if (sqlite3_open("./student.db",&db)!=0)//打开
{
fprintf(stderr,"err:%s\n",sqlite3_errmsg(db));
return -1;
}
printf("打开成功\n");
char *errmsg=NULL;
/* 避免重复 执行,所以注释了
if (sqlite3_exec(db,"create table stu(id int primary key,\
name cahr,score float);",NULL,NULL,&errmsg)!=SQLITE_OK)//插入
{
fprintf(stderr,"err:%s\n",errmsg);
//return -1;
}
int n;//输入几个
int id;
char name[32];
float score;
char sql[128];//seq语句存放位置
printf("请输入:\n");
scanf("%d",&n);
for (int i = 0; i < n; i++)
{
scanf("%d %s %f",&id,name,&score);
sprintf(sql,"insert into stu values(%d,\"%s\",%f);",id,name,score);//插入
printf("sql:%s\n",sql);
if(sqlite3_exec(db,sql,NULL,NULL,&errmsg)!=SQLITE_OK)
{
fprintf(stderr,"err:%s\n",errmsg);
return -1;
}
}
*/
//查询
if (sqlite3_exec(db,"select * from stu;",callback,"hello",&errmsg)!=SQLITE_OK)
{
fprintf(stderr,"err %s\n",errmsg);
return -1;
}
sqlite3_close(db);
return 0;
}
sqlite3_exec(db,"select * from stu;",callback,"hello",&errmsg)//参数
sqlite3* //打开的数据库
const char* sql, //执行的sql功能语句
*callback, //sql语句对应的回调函数
void* data, //传递给回调函数的 指针参数,我在这里定义为了hello,方便理解
char **errmsq //错误
callback(void *arg,int f_num,char **f_value,char **f_name)//回调的参数
功能:select:每找到一条记录自动执行一次回调函数
para:传递给回调函数的参数(由 sqlite3_exec() 的第四个参数传递而来)
f_num:记录中包含的字段数目
f_value:包含每个字段值的指针数组(列值)
f_name:包含每个字段名称的指针数组(列名)
返回值:成功返回SQLITE_OK,失败返回-1,每次回调必须返回0后才能继续下次回调
运行结果
个人理解,如果有误,欢迎指正