It is also important to develop organized thinking and learning to think of different things one by one in order.--------培养清晰有条理的思考习惯,学会依次考虑不同的事情,也是很重要的。
文章目录
1,sqlite简介
SQLite 是一款轻量级的关系型数据库,同时也是一种嵌入式数据库,与 Oracle、MySQL、SQL Server 等数据库不同,它可以内嵌在程序中,是程序中的一个组成部分。
特点为占用资源少,管理简单,操作简单,生成的数据库文件很容易与各个平台兼容。
2,sqlite3数据库的安装
2.1本地安装
sudo dpkg -i *.deb
2.2 在线安装
sudo apt-get install sqlite3
sudo apt-get install sqlite3 libsqlite3-dev
2.3 创建新的数据库
sqlite3 student.db //这个命令后就可以在sqlite3提示符下进行数据库操作了
3 ,sqlite3的基本命令
3.1 系统命令
以‘.’开头的命令叫做系统命令,例如常用的有,
.help 帮助
.quit 退出
.exit 退出
.schema 查看表的结构图,相当于查看表格的第一行
.table 查看已有的表格
.databases 查看数据库信息
3.2 sql命令(除了系统命令,下面的命令都要以;结尾)
创建一张新的数据库表stu
creat table stu(id Interger,name char,score Interger);//必须以分号结尾,下面的也是
插入全部记录
insert into stu values(1001,‘zhangshan’,47);
插入部分记录
insert into stu (name,score)values(‘xuxinhua’,90);
查询全部插入的记录
select * from stu;
查询部分字段
select name,score from stu;
条件查询
select * from stu where score=90 and id=1001;//同时满足
select * from stu where score=90 or id=1001;//或者满足
删除一条记录
delete from stu where name=‘xuxinhua’;
更新一条记录
update stu set name=‘xuxinhua’,score=90 where id=1001;
添加一列
alter table stu add clomn address char;
选择旧表中指定的列然后创建一张新的表格
create table stu1 as select id,name,score from stu;
删除一张表
drop table stu;
改变一张表格的名字
alter table stu1 rename to stu;
4,sqlite API函数
4.1 打开数据库sqlite3_open()
int sqlite3_open(char *path, sqlite3 **ppDb);
功能:打开slite3 数据库
path:数据库文件路径
db:指向数据库句柄的指针
返回值:成功返回SQLITE_OK,失败返回错误码(非零值)
4.2 关闭数据库sqlite3_close()
int sqlite3_close(sqlite3* ppDb);
关闭数据库
4.3 获取错误码sqlite3_errmsg()
const char *sqlite3_errmsg(sqlite3*ppDb);
函数功能:获取数据库操作错误时的错误码
4.4 执行sql命令sqlite3_exec()
int sqlite3_exec(
sqlite3* ppDb,
/* An open database */
const char *sql,
/* SQL to be evaluated */
int (*callback)(void* arg,int,char**,char**),
/* Callback function */
void * arg,
/* 1st argument to callback */
char **errmsg
/* Error msg written here */
);
函数功能:执行sql指定的数据库命令操作。
参数说明:
ppDb:splite3_open操作时的第二个参数dB数据操作句柄
sql:SQL命令,可以有多条命令组成
callback:执行完该函数的回调函数,只有sql为查询语句的时候才会执行此语句。
void * arg: 作为callback回调函数的第一个参数传入
errmsg:获取函数错误是的错误码
回调函数
int sqlite_callback(
void* para,
int f_num,
char** f_value,
char** f_name
);
说明:每找到一条记录自动执行一次回调函数
para:传递给回调函数的参数
f_num:记录中包含的字段数目
f_value:包含每个字段值的指针数组
f_name:包含每个字段名称的指针数组
返回值:成功返回0,失败返回-1
sqlite3_get_table()
int sqlite3_get_table(
sqlite3 *ppDb,
/* An open database */
const char *zSql,
/* SQL to be evaluated */
char ***dbResult,
/* Results of the query */
int *pnRow,
/* Number of result rows written here */
int *pnColumn,
/* Number of result columns written here */
char **pzErrmsg
/* Error msg written here */
);
函数功能:获取数据库表格
函数参数:
ppDb:同上
zSql:SQL命令
dbResult:查询结果,它依然是一维数组,它内存布局是:字段名称,后面是紧接着是每个字段的值。
pnRow:查出具体有多少行,即多少条记录(不包括字段名那行)。
pnColumn:查出具体有多少列,即多少字段
pzErrmsg:错误信息
5, 例子代码
下面给出简单例子
需要注意:编译的时候加-lsqlite3
#include <stdio.h>
#include <sqlite3.h>
int main(int argc, char *argv[])
{
sqlite3 * db;
char *errmsg;
if(sqlite3_open("./student.db", &db) != SQLITE_OK)
{
printf("%s\n",sqlite3_errmsg(db));
return -1;
}
else
{
printf("open student.db success\n");
}
if(sqlite3_exec(db, "create table xuxinhua (name char);", NULL, NULL, &errmsg) != SQLITE_OK)
{
printf("%s\n",errmsg);
}
printf("table success\n");
sqlite3_close(db);
return 0;
}
6, 综合性代码
下面我们编写一个使用程序完成数据库操作
/*********************************************************************************
* Copyright: (C) 2020 lingyun
* All rights reserved.
*
* Filename: sqlite3.c
* Description: This file
*
* Version: 1.0.0(2020年02月27日)
* Author: xuxinhua <[4~[D[4~xxu>
* ChangeLog: 1, Release initial version on "2020年02月27日 14时36分31秒"
*
********************************************************************************/
#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>
#define table_name "stu.db"
//用于添加新一行的函数
int do_insert(sqlite3 * db)
{
int id;
char name[32]= {};
int score;
char sql[128] = {};
char *errmsg;
printf("input id:");
scanf("%d", &id);
getchar();
printf("input name:");
scanf("%s", name);
getchar();
printf("input score:");
scanf("%d", &score);
getchar();
sprintf(sql, "insert into firstclass values(%d,'%s', %d);", id, name, score);
if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
{
printf("%s\n", errmsg);
}
else
{
printf("insert done.\n");
}
return 0;
}
//回调函数
int callback(void *para, int f_num, char **f_value, char **f_name)
{
int i = 0;
for (i = 0; i < f_num; i++)
{
printf("%-11s", f_value[i]);
}
putchar(10);
return 0;
}
//用于查询的函数
int do_query(sqlite3 * db)
{
char sql[128] = {};
char *errmsg;
sprintf(sql, "select * from firstclass;");
if(sqlite3_exec(db, sql, callback, NULL, &errmsg) != SQLITE_OK)
{
printf("%s\n", errmsg);
}
else
{
printf("query done.\n");
}
return 0;
}
//用于删除行的函数
int do_delete(sqlite3 * db)
{
int id;
char name[32] = {};
int score;
char sql[128] = {};
char *errmsg;
printf("input id:");
scanf("%d", &id);
getchar();
sprintf(sql, "delete from firstclass where id=%d;", id);
if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
{
printf("%s\n", errmsg);
}
else
{
printf("delete done.\n");
}
return 0;
}
//用来跟新行的函数
int do_update(sqlite3 * db)
{
int id;
int score;
char sql[128] = {};
char *errmsg;
char name[32] = {};
printf("input update id:");
scanf("%d", &id);
getchar();
printf("input update score:");
scanf("%d", &score);
getchar();
sprintf(sql, "update firstclass set score =%d where id = %d;", score, id);
if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
{
printf("%s\n", errmsg);
}
else
{
printf("update done.\n");
}
return 0;
}
//主函数
int main(int argc, char *argv[])
{
sqlite3 *db;
char *errmsg;
int cmd;
if(sqlite3_open(table_name, &db) != SQLITE_OK)
{
printf("%s\n",sqlite3_errmsg(db));
return -1;
}
else
{
printf("open table_name success\n");
}
//CREATE NEW TABLE
if(sqlite3_exec(db, "create table firstclass (id Integer, name char, score Integer);", NULL, NULL, &errmsg) != SQLITE_OK)
{
printf("%s\n",errmsg);
}
printf("create table success\n");
while (1)
{
printf("********************\n");
printf("1:insert 2:delete 3:query 4:update 5:quit\n");
printf("********************\n");
scanf("%d", &cmd);
getchar();
switch (cmd)
{
case 1:
do_insert(db);
break;
case 2:
do_delete(db);
break;
case 3:
do_query(db);
break;
case 4:
do_update(db);
break;
case 5:
sqlite3_close(db);
exit(0);
default:
printf("Error cmd.\n");
}
}
return 0;
}
-
这个代码我们创建stu.db的数据库,并创建第一个班级的成绩表
-
下面是演示:
先插入三个学生a,b,c
-
然后删除学生a
-
然后跟新学生b成绩
-
最后退出