1.打开/创建数据库的C语言接口
- int sqlite3_open(const char *filename, sqlite3 **ppDb)
- 该例程打开一个指向 SQLite 数据库文件的连接,返回一个用于其他 SQLite 程序的数据库连接对象。
- int sqlite3_close(sqlite3*)
- 该例程关闭之前调用 sqlite3_open() 打开的数据库连接。所有与连接相关的语句都应在连接关闭之前完 成。
- 如果还有查询没有完成,sqlite3_close() 将返回 SQLITE_BUSY 禁止关闭的错误消息。
- const char *sqlite3_errmsg(sqlite3*);通常用来返回最近调用的API接口的错误信息
- int sqlite3_errcode() 通常用来获取最近调用的API接口返回的错误代码.
下面的
C 代码段显示了如何使用
sqlite3_open
连接到一个现有的数据库。如果数据库不存在,那么它就会被创建,最后将返回一个数据库对象。
#include <stdio.h>
#include <sqlite3.h>
int main(int argc,char **argv)
{
sqlite3* pd;
int ret;
if(argc < 2){
printf("ought to %s xxx.db\n",argv[0]);
return -1;
}
if((ret=sqlite3_open(argv[1],&pd))==SQLITE_OK){//第二个参数是一个二级指针
printf("open succeed %s\n",argv[1]);
}else{
printf("error:%s ret = %d\n",sqlite3_errmsg(pd),ret);
}
sqlite3_close(pd);
printf("close");
}
执行结果,这里显示打开了数据库
2.创建表的C接口
1、函数介绍
sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)
- sqlite3 是打开的数据库对象
- sqlite_callback 是一个回调
- data 作为回调函数的第一个参数
- errmsg 将被返回用来获取程序生成的任何错误
- sqlite3_exec() 程序解析并执行由 sql 参数所给的每个命令,直到字符串结束或者遇到错误为止
数据库中有n条数据回调函数就会调用n次,注意return 0;得返回0,经过验证返回其他的只会调用一次
sqlite3_exec的最后一个参数errmsg返回的是错误信息,这里我们直接传递一个char型的指针,经过验证这里不会发生段错误,sqlite3_exec函数会自动给空指针或野指针分配内存空间。
2、回调函数介绍
typedef int (*sqlite3_callback)(void*,int,char**, char**);函数原型int callback ( void * arg , int column_size , char * column_value [], char * column_name [])参数分析:
- void *arg:是sqlite3_exec函数的第四个参数
- column_size:数据库的字段 数
- column_value[]:列的值
- column_name:字段名字
函数原型也可以是
typedef int(*sqlite_callback)(void* para, int columenCount, char** columnValue, char** columnName);
- para : 由sqlite3_exec传入的参数指针,或者说是指针参数
- columnCount: 查询到的这一条记录由多少个字段(多少列)
- columnValue : 该参数是双指针,查询出来的数据都保存在这里,它是一个1维数组,每一个元素都是一个char*,是一个字段内容,所以这个参数就可以不是单字节,而是可以为字符串等不定长度的数值,用字符串表示,以’\0’结尾
- columnName : 该参数是双指针,语columnValue是对应的,表示这个字段的字段名称
这里使用二级指针上面使用指针数据,其实都一样,网上说使用这个回调函数必须static的,但是在C语言中我尝试不是也可以。
代码示例:查询数据库表中的内容
#include <stdio.h>
#include <sqlite3.h>
//typedef int(*sqlite_callback)(void* para, int columenCount, char** columnValue, char** columnName);
int callback(void *para,int columenCount,char** columnValue,char** columnName)
{
printf("para = %s\n",(char*)para);
for(int i =0;i<columenCount;i++){
printf("%-8s",columnName[i]);
}
printf("\n");
for(int i =0;i<columenCount;i++){
printf("%-8s",columnValue[i]);
}
printf("\n");
return 0;
}
int main(int argc,char **argv)
{
sqlite3* pd;
char *p = "happy";
int ret;
if(argc < 2){
printf("ought to %s xxx.db\n",argv[0]);
return -1;
}
if((ret=sqlite3_open(argv[1],&pd))==SQLITE_OK){//第二个参数是一个二级指针
printf("open succeed %s\n",argv[1]);
}else{
printf("error:%s ret = %d\n",sqlite3_errmsg(pd),ret);
}
//sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)
sqlite3_exec(pd,"select * from stu;",callback,p,NULL);//最后一个参数可以设置为NULL
sqlite3_close(pd);
printf("close");
}
运行结果