C语言操作数据库(SQLite3)调用接口函数
C语言连接数据库首先我们需要有数据库,所以我们需要创建数据库,在linux环境下进入sqlite3模式下,顺便在后面写上数据库名:首先定义一个数据库指针类型,然后调用数据库的接口函数:sqlite3_open(“数据库名”,指针地址)”,函数功能:打开一个数据库,如果这个数据库文件不存在,则自动创建,打开或者创建数据库的命令会被缓存,直到这个数据库真正被调用的时候才会被执行。并且让上面定义的指针指
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;
}
更多推荐
所有评论(0)