1、安装数据库
我们从SQLi官网下载页面 , https://www.sqlite.org/download.html 从源代码区下载 sqlite-autoconf-*.tar.gz。
然后在 Linux 下安装sqlite3
第一步:安装
第二步: 解压
第三步: 进入蓝色文件夹
第四步: ./configure(配置安装)
第五步: make (编译)
第六步: sudo make install (开始安装)
第七步: 安装成功
2、sqlite的相关函数
sqlite3_open()
函数原型:
#include <sqlite3.h>
int sqlite3_open(const char *dbname,sqlite3 **db)
函数说明:用来打开一个数据库
参数说明: 第一个参数dbname是数据库的名称;
第二个参数db是用于保存打开的数据库文件dbname的信息。
sqlite_close()
函数原型:
#include <sqlite3.h>
int sqlite3_close(sqlite3 *db)
函数说明:用来关闭一个数据库。
参数说明:db需要关闭的数据库文件。
sqlite3_exec()
函数原型:
#include <sqlite3.h>
int sqlite_exec(sqlite *db, const char *sql, int (*callback)(void *int,char **,char **),void *,char **errmsg);
函数说明: 用来执行sqlite3语句
参数说明: 第一个参数:db是用于保存打开的数据库文件dbname的信息;
第二个参数: sql你要执行命令的语句;
第三个参数: callback回调函数,当这条语句执行之后,sqlite3会去调用你提供的这个函数。通常设为NULL;
第四个参数: void *是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL。
第五个参数: 是错误信息。
说明:通常 sqlite3_callback和它后面的void*这两个位置都可以填NULL 。填NULL表示你不需要回调。比如你做insert 操作,做delete操作,就没有必要使用回调。而当你做select 时,就要使用回调,因为sqlite3 把数据查出来,得通过回调告诉你查出了什么数据。虽然回调显得代码整齐,但有时候你还是想要非回调的select查询。这可以通过sqlite3_get_table 函数做到。
sqlite3_get_table()
函数原型:
#include <sqlite3.h>
int sqlite3_get_table(sqlite3 *db, const char *zsql,char ***pazResult, int *nrow, int *ncolumn,char **zErrmsg);
函数说明: 执行sql的查询功能
参数说明: 第一个参数db:db是用于保存打开的数据库文件dbname的信息;
第二个参数: sqlite3的语句,跟sqlite3_exec里的sql是一样的,是一个很普通的以\0结尾的char *字符串。
第三个参数: 查询的结果,它依然是一维数组,他的内存布局时:字段名称,后面时紧接着是每个字段值。
第四个参数: 是查询出多少条记录(即查出是多少行,不包括字段名那行)
第五个参数: 是多少个字段(多少列)
第六个参数: 是错误信息
注意:如果提供了errmsg,用来创建错误消息的内存是在堆上分布的,故在调用后,应该检查一下是否为null值, 如果有错误发生,使用sqlite3_free()释放errmsg占用的内存 。
3、代码示例
创建一个数据库
示例代码:
#include <stdio.h>
#include <string.h>
#include <sqlite3.h>
#include <stdlib.h>
int main (int argc, char **argv)
{
sqlite3 *db = NULL;
int data = -1;
//打开指定的数据库文件,如果不存在将创建一个同名的数据库文件
data = sqlite3_open("test.db",&db);
if(data < 0)
{
printf("create testsqlite failure:%s\n",sqlite3_errmsg(db)); //创建失败
return -1;
}
else
{
printf("create testsqlite successfuly\n"); //创建成功
sqlite3_close(db);//关闭数据库
return 0;
}
}
执行结果:
需要注意的时在编译时需要在末尾加上一个 -lsqlite3,不然会抛错。
ls 查看目录多了刚命名的数据库 test.db
插入数据
示例代码:
#include <stdio.h>
#include <string.h>
#include <sqlite3.h>
#include <stdlib.h>
int main (int argc, char **argv)
{
sqlite3 *db = NULL;
int data = -1;
char *msg=0;
char *sql;
//打开指定的数据库文件,如果不存在将创建一个同名的数据库文件
data = sqlite3_open("test.db",&db);
if(data < 0)
{
printf("create testsqlite failure:%s\n",sqlite3_errmsg(db));
return -1;
}
else
{
printf("create testsqlite successfuly\n");
}
sql = "CREATE TABLE stu(ID number, name, age );";
sqlite3_exec(db, sql, 0, 0,&msg);
//以下为添加数据
sql = "INSERT INTO stu VALUES('1','huang','100');";
sqlite3_exec(db, sql, 0, 0,&msg);
sql = "INSERT INTO stu VALUES('2','chen','90');";
sqlite3_exec(db, sql, 0, 0,&msg);
printf("Insert successfuly\n");
sqlite3_close(db);//关闭数据库
return 0;
}
执行结果:
创建了一个 stu 的一个表
sqlite3 test.db 进入我们创建的数据库中 ,在sqlite->中输入select *from stu之后就会出现我们刚才往表里插入的内容
查看表的内容
示例代码:
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <sqlite3.h>
#include <stdlib.h>
int main (int argc, char **argv)
{
sqlite3 *db = NULL;
int data;
char *msg=0;
int row=0,column=0; //行 列
char **Result=NULL; //结果
char *sql;
//打开指定的数据库文件,如果不存在将创建一个同名的数据库文件
data = sqlite3_open("test.db",&db);
if(data)
{
printf("create testsqlite failure:%s\n",sqlite3_errmsg(db));
exit(1);
}
printf("create testsqlite successfuly\n");
sql ="SELECT *FROM stu";
data =sqlite3_get_table(db, sql, &Result, &row, &column,&msg);
if(data ==0 )
{
printf("row:%d column=%d \n", row , column);
printf("the result of querying is:\n");
int i=0,j=0;
for (i=0; i< (row+1) *column; i++)
{
printf("%s", Result[i]);
printf("\n");
}
}
else if(data)
{
printf("SQL error!:%s\n",msg);//打印错误信息
sqlite3_free(msg);//释放掉azResult的内存空间
}
sqlite3_close(db);//关闭数据库
return 0;
}
执行结果:
删除数据
示例代码:
#include <errno.h>
#include <stdio.h>
#include <string.h>
#include <sqlite3.h>
#include <stdlib.h>
int main (int argc, char **argv)
{
sqlite3 *db=NULL;
int data;
char *msg=0;
char *sql;
char *data1;
//打开指定的数据库文件,如果不存在将创建一个同名的数据库文件
data = sqlite3_open("test.db",&db);
if(data)
{
printf("create tetssqlite failure:%s\n",sqlite3_errmsg(db));
exit(1);
}
printf("create testsqlite successfuly\n");
sql ="DELETE FROM stu";
data=sqlite3_exec(db,sql,NULL,(void *)data1,&msg);
if(data)
{
printf("SQL error!:%s\n",msg);//打印错误信息
sqlite3_free(msg);//释放掉zerrmsg的内存空间
}
else
{
printf("delete recodes successfuly\n");
}
sqlite3_close(db);//关闭数据库
return 0;
}
执行结果:
打开sqlite3创建的表 test.db表中 (数据不见了)