irpas技术客

C语言操作数据库(SQLite3)调用接口函数_冬雪如春_sqlite3函数接口

未知 5857

C语言连接数据库首先我们需要有数据库,所以我们需要创建数据库, 在linux环境下进入sqlite3模式下,顺便在后面写上数据库名: 首先定义一个数据库指针类型,然后调用数据库的接口函数:sqlite3_open(“数据库名”,指针地址)”,函数功能:打开一个数据库,如果这个数据库文件不存在,则自动创建,打开或者创建数据库的命令会被缓存,直到这个数据库真正被调用的时候才会被执行。并且让上面定义的指针指向这个数据库。ret 变量是用来接收这个接口函数的返回值,这个函数的返回值是SQLITE_OK 它的值也就是0,表示打开成功,如果不是,那么就要报错。下面对其进行判断 到这里我们数据库打开就操作完成了,后面就开始在数据库中创建表,因为没有表数据往哪里插呢,好,来创建数据库中的table。 这里是对创建表函数的返回值的一个判断,如果返回值不是SQLITE_OK那么就会导致表创建不成功。 上图是创建表函数,函数参数是传递指向数据库的指针,红色标记 1 所在的字符串是创建表的sql语句,这里加了这三个单词,是为了往后再执行这个代码时不会报这个表已经存在的错,这句话就是说,创建mytable的表,如果表存在就不创建了,就用就好了,如果不存在就创建。红色标记 2 是调用数据库接口函数,这个函数可以做好几件事。 该函数接口原型是: int sqlite3_exec(sqlite3 *db, const char *sql, sqlite3_callback callback, void *,char **errmsg); db:调用的数据库 sql:sql语句 callback:回调函数,每成功执行一次sql语句就执行一次callback函数 void *:给回调函数传的参数(这里当需要使用时,需要进行强制类型转换) errmsg:错误信息

上面创建数据库和创建表都完成后,后面就要开始插入数据操作了,这里注意哈,插入时要和上一步在创建表时的字段名顺序要一样。 上图的sql 定义的是数组,而在创建表时sql定义的是一个字符指针,注意这两个用法不一样虽然代表的都是sql语句,创建表的那个是直接指向sql语句,其实就是指向字符串的首地址,这里sql是用在sprintf()函数里面的。这个函数是将第三个参数,放到第二个参数里面,然后再将第二个参数放到第一个参数里面,所以这里需要用数组来接这一串字符,这是为什么要这一步操作,是因为这一步我们要将我们自己要输入的数据输入进去,所以这一步是必要的。 后面也用到接口函数sqlite3_exec()函数,这个函数可用于创建表,插入数据,删除数据,显示数据 这里作用和创建表差不多,就是在这个数据库中插入数据,如果成功就进行下一步,如果不成功返回错误信息。

后面插入完成就可以进行查看,看下图: 上图显示表中数据就要用到回调函数那个参数了,这里的display就是回调函数,后面的(void *)&flag是给回调函数用的,这里取地址是因为这里要改变flag的值,所以传地址过去,这个回调函数看下图: 这里回调函数就是要显示输出table中的数据。 显示完之后还对数据库中的数据再进行删除操作。 这里和上面用到的差不多,sql语句变化了,再改一些提示 下面是使用sqlite3_get_table()函数接口 我们要使用的是sqlite_get_table()函数的原型是: int sqlite3_get_table( sqlite3 *db, //打开的数据库的句柄 const char *zSql, //要执行的SQL语句 char pazResult, //结果写入该指针指向的char int *pnRow, //结果集中行的数目 int *pnColumn, //结果集中列的数目 char **pzErrmsg //错误信息 );

再对其进行输出显示操作。 好了,差不多就这么多,结束。把源码贴上。

#include <stdio.h> #include <sqlite3.h> #include <stdlib.h> //调用数据库接口API //创建表 int create_table(sqlite3 *pdb) { char *sql = NULL; char *errmsg = NULL; int ret; sql = "create table if not exists mytable (id integer primary key,name text);"; ret = sqlite3_exec(pdb,sql,NULL,NULL,&errmsg); if(SQLITE_OK != ret) { printf("create table error! %s\n",errmsg); return -1; } else { return SQLITE_OK; } } //插入数据 int insert_record(sqlite3 *pdb) { char sql[100]; char *errmsg = NULL; int ret; int id; char name[20]; printf("please input id and name: \n"); scanf("%d",&id); scanf("%s",name); //将id和name打印在字符串,保存在sql中 sprintf(sql,"insert into mytable (id,name) values (%d,'%s');",id, name); ret = sqlite3_exec(pdb,sql,NULL,NULL,&errmsg); if(SQLITE_OK != ret) { perror("insert error!"); printf("insert record 1 error! %s\n",errmsg); return -1; } /* else { return SQLITE_OK; }*/ return SQLITE_OK; } //回调函数,函数名和参数的名可变,但是返回值类型,参数类型,参数数量和位置不能变。 //回调函数 1回调函数中第四个参数 2表的列数 // 3指向查询结果的指针数组 4指向表头名的指针数组 int display(void *para, int ncol, char *col_val[], char **col_name) { int i; int *flag = NULL; flag = (int *)para; if(0 == *flag) { *flag = 1; //输出列数 printf("column number is: %d\n", ncol); for(i = 0; i < ncol; i++) { printf("%10s",col_name[i]); } printf("\n"); } for(i = 0; i < ncol; i++) { printf("%10s",col_val[i]); } printf("\n"); return 0; } //显示 int inquire_uscb(sqlite3 *pdb) { char *sql = NULL; char *errmsg = NULL; int ret; int flag = 0; sql = "select * from mytable;"; //数据库,语句字符串,回调函数,用户输入的参数,最终传给回调函数使用,错误信息 ret = sqlite3_exec(pdb,sql,display,(void *)&flag,&errmsg); if(SQLITE_OK != ret) { printf("select error! %s\n",errmsg); return -1; } else { return SQLITE_OK; } } //删除 int delete_record(sqlite3 *pdb) { char sql[100]; char *errmsg = NULL; int ret; int id; printf("please input delete id:\n"); scanf("%d",&id); sprintf(sql,"delete from mytable where id = %d;", id); ret = sqlite3_exec(pdb,sql,NULL,NULL,&errmsg); if(SQLITE_OK != ret) { printf("delete error! %s\n",errmsg); return -1; } else { return SQLITE_OK; } } //显示 int inquire_nocb(sqlite3 *pdb) { char *sql = NULL; char ** ret_val = NULL; char *errmsg = NULL; int nrow; int ncol; int ret; int i; sql = "select * from mytable"; ret = sqlite3_get_table(pdb, sql, &ret_val, &nrow, &ncol, &errmsg); if(SQLITE_OK == ret) { printf("nrow = %d ncol = %d\n",nrow,ncol); for(i = 0; i < (nrow + 1)* ncol; i++ ) { printf("%10s",ret_val[i]); if((i + 1) % ncol == 0) { printf("\n"); } } } else { sqlite3_free_table(ret_val); return -1; } sqlite3_free_table(ret_val); } int main(int argc, char **argv) { sqlite3 *pdb; //定义一个数据库指针 int ret; //接sqlite3_open()函数的返回值 ret = sqlite3_open("mydatabase.db",&pdb); //打开数据库,让指针指向这个数据库 if(ret != SQLITE_OK) //判断数据库打开是否成功 { //提示打开失败并且返回错误说明信息 printf("open database fail! %s\n",sqlite3_errmsg(pdb)); exit(1); } else { printf("open database successfully!\n"); } //以上是打开数据库 //打开数据库之后要创建表 if(SQLITE_OK == create_table(pdb)) { printf("create table success!\n"); } else { sqlite3_close(pdb); return 0; } //以上是创建表,后面就要往里面插数据 if(0 != insert_record(pdb)) { sqlite3_close(pdb); exit(-1); } //以上是插入数据,后面要显示出来 //显示 inquire_uscb(pdb); //删除 delete_record(pdb); //显示 inquire_nocb(pdb); //关闭数据库 sqlite3_close(pdb); return 0; }


1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,会注明原创字样,如未注明都非原创,如有侵权请联系删除!;3.作者投稿可能会经我们编辑修改或补充;4.本站不提供任何储存功能只提供收集或者投稿人的网盘链接。

标签: #sqlite3函数接口 #ret #它的值也