1、sqlite3数据库概要
SQLite3是一个轻量级、跨平台的关系型数据库。SQLite的很小,它的数据库就是一个文件,但是它并不缺乏功能。不需要复杂的安装或管理。SQLite事务是完全兼容ACID的,允许从多个进程或线程安全访问。因此sqlit3十分适合进行嵌入式开发。
2、开发环境
运行环境:Ubuntu + linux操作系统
3、基本功能
1、查看仓库信息:
显示仓库所有的货物的信息[例如 货物的编号 货物的名字 货物的价格 货物的剩余量 等]
2、入库功能:
增加现有货物的库存量(货物编号,增加数量)
3、 出库功能:
减少现有货物的库存量(货物编号,减少数量)
4、维护功能[管理功能]:
维护货物信息[例如 增加新货物种类 修改货物的名字 等]
5、离开
额外功能:
A 进入系统需要输入密码 [区分普通用户 和 管理员]
B 记录所有出库 和 入库 的信息 [包含 出库货物编号 、 时间、和操作员信息 等]
C 管理员可以有高级选项,比如新增用户,禁止用户,查询货物的进出库历史记录
4、代码段
新手操作可能有点代码冗余,请见谅,用于学习记录
sqlite.c
#include<stdio.h>
#include<sqlite3.h>
#include<string.h>
#include <stdlib.h>
#include <unistd.h>
sqlite3 *pdb = NULL;//数据库引擎
char *errmsg = NULL;//错误提示
char *tmp[2]; //保存一次查询的结果
int select_flag = 1;
int back_ret = 0;
struct db_goods
{
int gid;
int g_num;
}db_user;
/*
函数名:callback
函数功能:sqlite3_exex()的回调函数,用于获取select查询结果,他说逐行查询的
参数:
void* arg:调用时向回调函数传递的参数
column_num:该条结果有多少列
char* column_value[]:每一列的值
char* column_name[]:每一列的列名、
返回值:
返回0表示继续查询打印
*/
int callback(void* arg,int column_num,char *column_value[],char* column_name[])
{
int *id = NULL;
if(arg != NULL)
{
id = arg;
}
if(select_flag == 1)
{
select_flag = 0;
for(int i = 0;i < column_num;i++)
{
printf("%-10s",column_name[i]);
}
putchar('\n');
}
for(int i = 0;i<column_num; i++)
{
printf("%-10s",column_value[i]);
/*单独只查找id的情况*/
if(column_num == 1)
{ //printf("tmp = %s,%d\n",tmp,atoi(tmp));
if(arg != NULL)
{
strcpy(tmp[i],column_value[i]);
char buf[20];
sprintf(buf,"%d",*id);
if(strcmp(tmp[0],buf) == 0)
{
back_ret = 999;
return back_ret;
}
}
}
else/*通过id查找数量的情况*/
{
if(arg != NULL)
{
strcpy(tmp[i],column_value[i]);
char buf[20];
sprintf(buf,"%d",*id);
if(i != 0 &&strcmp(tmp[0],buf) == 0)
{
back_ret = 999;
return back_ret;
}
}
}
}
putchar('\n');
return 0;//表示继续查询打印
}
/*检查密码是否正确*/
int callback2(void* arg,int column_num,char *column_value[],char* column_name[])
{
char *pw = arg;
if(select_flag == 1)
{
select_flag = 0;
for(int i = 0;i < column_num;i++)
{
printf("%-10s",column_name[i]);
}
putchar('\n');
}
for(int i = 0;i<column_num; i++)
{
printf("%-10s",column_value[i]);
strcpy(tmp[i],column_value[i]);
if(strcmp(tmp[0],pw) == 0)
{
back_ret = 999;
return back_ret;
}
}
putchar('\n');
return 0;//表示继续查询打印
}
/*链接数据库*/
int sqlite_init()
{
int r = sqlite3_open("warehouse.db",&pdb);
if(r != SQLITE_OK)
{
printf("sqlite3 open failed\n");
return -1;
}
printf("sqlite 连接成功\n");
for(int i= 0;i < 2;i++)
tmp[i] = (char *)malloc(sizeof(32));
return 0;
}
/*断开数据库链接*/
void sqlite_uninit()
{
for(int i= 0;i < 2;i++)
free(tmp[i]);
sqlite3_close(pdb);
}
/*查找gid是否存在*/
int select_gid(int gid)
{
char buf[100];
memset(buf,0,sizeof(buf));
select_flag = 1; //打开打印首行的标志位
back_ret = 0;
sprintf(buf,"select gid from db_goods where gid=%d;",gid);
int r = sqlite3_exec(pdb,buf,callback,&gid,&errmsg);
if(back_ret == 999)//说明存在该商品
{
return 0;
}
else
{
return -1;
}
}
//查找货物标号为gid的货物的数量
int select_one_goods(int gid)
{
char buf[100];
memset(buf,0,sizeof(buf));
select_flag = 1; //打开打印首行的标志位
back_ret = 0;
sprintf(buf,"select gid,g_num from db_goods where gid=%d;",gid);
int r = sqlite3_exec(pdb,buf,callback,&gid,&errmsg);
if(back_ret == 999)
{
int num = atoi(tmp[1]);
return num;
}
else
{
printf("select_one_goods sqlite3 select failed\n");
return -1;
}
}
//增加货物数量
int increase_goods(int gid,int num)
{
char buf[100];
int r = 0; //接收返回值
int old_num = select_gid(gid);
if(old_num == -1) //没有这个货物则创建
{
printf("请补充货物名:");
char name[50];
scanf("%s",name);
printf("请补充货物单价:");
int price=0;
scanf("%d",&price);
sprintf(buf,"insert into db_goods values(%d,'%s',%d,%d);",gid,name,price,num);
r = sqlite3_exec(pdb,buf,NULL,NULL,&errmsg);
if(r != 0)
{
printf("increase_goods sqlite3 insert failed\n");
return -1;
}
printf("感谢您添加成功\n");
sleep(2);
return 0;
}
old_num = select_one_goods(gid);
int new_num = num + old_num;
/*修改数据库的货物数量*/
memset(buf,0,sizeof(buf));
sprintf(buf,"update db_goods set g_num=%d where gid=%d;",new_num,gid);
r = sqlite3_exec(pdb,buf,NULL,NULL,&errmsg);
if(r != 0)
{
printf("increase_goods sqlite3 update failed\n");
return -1;
}
printf("感谢您添加成功\n");
return 0;
}
//减少货物数量
int decrease_goods(int gid,int num)
{
char buf[100];
int old_num = select_gid(gid);//查看该商品是否存在
if(old_num == -1)
{
printf("商品不存在\n");
return -1;
}
old_num = select_one_goods(gid);
int new_num = old_num - num;
/*存货不足时*/
if(new_num < 0)
{
printf("十分抱歉存货不足,先给您%d件,缺少%d件\n",old_num,-new_num);
new_num = 0;
}
/*修改数据库的货物数量*/
memset(buf,0,sizeof(buf));
sprintf(buf,"update db_goods set g_num=%d where gid=%d;",new_num,gid);
int r = sqlite3_exec(pdb,buf,NULL,NULL,&errmsg);
if(r != 0)
{
printf("decrease_goods sqlite3 update failed\n");
return -1;
}
return 0;
}
//显示仓库所以货物及相关信息
void show_warehouse()
{
char buf[100];
memset(buf,0,100);
select_flag = 1; //打开打印首行的标志位
sprintf(buf,"select * from db_goods;");
int r = sqlite3_exec(pdb,buf,callback,NULL,&errmsg);
if(r != 0)
{
printf("show_warehouse sqlite3 show failed\n");
}
}
/*--------------------------用户表操作-----------------------------------*/
/*注册一个用户*/
int enroll_user()
{
int id;
char pw[100];
char name[100];
printf("请输入您要注册的id号:");
scanf("%d",&id);
printf("请输入您密码:");
scanf("%s",pw);
printf("请输入您的名称:");
scanf("%s",name);
printf("请稍等\n");
char buf[100];
memset(buf,0,100);
select_flag = 1; //打开打印首行的标志位
back_ret = 0;
sprintf(buf,"select id from db_user where id=%d;",id);
int r = sqlite3_exec(pdb,buf,callback,&id,&errmsg);
/*找不到id相同的则注册*/
if(back_ret != 999)
{
memset(buf,0,100);
sprintf(buf,"insert into db_user values(%d,'%s','%s');",id,pw,name);
r = sqlite3_exec(pdb,buf,NULL,NULL,&errmsg);
if(r != 0)
{
printf("enroll_user sqlite3 insert failed\n");
return -1;
}
else
{
printf("注册成功\n");
sleep(1);
}
}
else
{
printf("id已注册\n");
return -1;
}
return 0;
}
/*普通用户登录*/
int login_goods(int id,char *pw)
{
char buf[100];
memset(buf,0,100);
select_flag = 1; //打开打印首行的标志位
back_ret = 0;
sprintf(buf,"select id from db_user where id=%d;",id);
int r = sqlite3_exec(pdb,buf,callback,&id,&errmsg);
/*表示数据库中有该账户*/
if(back_ret == 999)
{
printf("账号正确...\n");
memset(buf,0,100);
select_flag = 1; //打开打印首行的标志位
back_ret = 0;
sprintf(buf,"select pw from db_user where pw=%s AND id=%d;",pw,id);
int r = sqlite3_exec(pdb,buf,callback2,pw,&errmsg);
if(back_ret == 999)
{
printf("密码正确...\n");
return 0;
}
else
{
printf("密码错误...\n");
return -1;
}
}
else
{
printf("查无此id...\n");
return -1;
}
}
/*注销id账号*/
void logout_id(int id)
{
char buf[100];
memset(buf,0,100);
select_flag = 1; //打开打印首行的标志位
back_ret = 0;
sprintf(buf,"select id from db_user where id=%d;",id);
int r = sqlite3_exec(pdb,buf,callback,&id,&errmsg);
if(back_ret == 999)
{
memset(buf,0,100);
select_flag = 1; //打开打印首行的标志位
back_ret = 0;
sprintf(buf,"delete from db_user where id=%d;",id);
r = sqlite3_exec(pdb,buf,NULL,NULL,&errmsg);
if(r == 0)
{
printf("注销成功\n");
}
else
{
printf("注销成功\n");
}
}
else
{
printf("账号不存在\n");
}
}
client.c
#include<stdio.h>
#include<sqlite3.h>
#include<string.h>
#include"sqlite.h"
#include<stdlib.h>
int sel;
/*登录后客户端初始化界面*/
void client_init()
{
while(1)
{
system("clear");
printf("+---------------------------------------+\n");
printf("| 登录成功 |\n");
printf("|1.查看仓库货物信息 |\n");//已完成
printf("|2.购买货物 |\n");//已完成
printf("|3.售卖货物 |\n");//已完成
printf("|4.退出 |\n");//已完成
printf("+---------------------------------------+\n");//已完成
scanf("%d",&sel);
switch (sel)
{
case 1: { //显示当前仓库的货物信息
show_warehouse();
printf("按0重新返回登录界面,按其他任意键退出系统\n");
scanf("%d",&sel);
if(sel != 0)
return;
}
break;
case 2:
{
int gid;
int num;
show_warehouse();
printf("请输入您要购买的货物的ID号:");
scanf("%d",&gid);
printf("请输入您要购买的货物数量:");
scanf("%d",&num);
decrease_goods(gid,num);
}
break;
case 3:
{
int gid;
int num;
printf("请输入您要售卖的货物的ID号:");
scanf("%d",&gid);
printf("请输入您要售卖的货物数量:");
scanf("%d",&num);
increase_goods(gid,num);
}
;break;
case 4: return;
}
}
}
void client_join()
{
int id;
char pw[20];
while(1)
{
printf("请输入您的账户id:");
scanf("%d",&id);
printf("请输入您的账户密码:");
scanf("%s",pw);
int r = login_goods(id,pw);
if(r == -1)
{
printf("按0重新返回登录界面,按其他任意键退出系统\n");
scanf("%d",&sel);
if(sel != 0)
return;
}
else
{
client_init();
break;
}
}
}
super_user_join.c
#include<stdio.h>
#include<sqlite3.h>
#include<string.h>
#include"sqlite.h"
#include<stdlib.h>
int sel;
void souper_user_init()
{
while(1)
{
system("clear");
printf("+---------------------------------------+\n");
printf("| 登录成功 |\n");
printf("|1.查看仓库货物信息 |\n");//已完成
printf("|2.删除货物 |\n");//已完成
printf("|3.增加货物 |\n");//已完成
printf("|4.退出 |\n");//已完成
printf("+---------------------------------------+\n");//已完成
scanf("%d",&sel);
switch (sel)
{
case 1: { //显示当前仓库的货物信息
show_warehouse();
printf("按0重新返回登录界面,按其他任意键退出系统\n");
scanf("%d",&sel);
if(sel != 0)
return;
}
break;
case 2:
{
int gid;
int num;
show_warehouse();
printf("请输入您要减少的货物的ID号:");
scanf("%d",&gid);
printf("请输入您要购买的货物数量:");
scanf("%d",&num);
decrease_goods(gid,num);
}
break;
case 3:
{
int gid;
int num;
printf("请输入您要增加的货物的ID号:");
scanf("%d",&gid);
printf("请输入您要售卖的货物数量:");
scanf("%d",&num);
increase_goods(gid,num);
}
;break;
case 4: return;
}
}
}
void souper_user_join()
{
int id;
char pw[20];
while(1)
{
printf("请输入您的账户id:");
scanf("%d",&id);
printf("请输入您的账户密码:");
scanf("%s",pw);
if(id != 12138)
{
printf("账号id输入错误\n");
printf("<------------------->\n\n");
printf("按0重新返回登录界面,按其他任意键退出系统\n");
scanf("%d",&sel);
if(sel != 0)
return;
else
{
continue;
}
}
if(strcmp(pw,"admin") != 0)
{
printf("账号密码输入错误\n");
printf("<------------------->\n\n");
printf("按0重新返回登录界面,按其他任意键退出系统\n");
scanf("%d",&sel);
if(sel != 0)
return;
else
{
continue;
}
}
souper_user_init();
}
}
main.c
#include<stdio.h>
#include<sqlite3.h>
#include<string.h>
#include<stdlib.h>
#include"sqlite.h"
#include"client.h"
#include"souper_user_join.h"
int sel;
void Choose()
{
while(1)
{
system("clear");
printf("+---------------------------------------+\n");
printf("|\t 欢迎来到仓库管理系统\t\t|\n");
printf("|\t1.登陆账号\t\t\t|\n");//已完成
printf("|\t2.注册账号\t\t\t|\n");//已完成
printf("|\t3.注销账号信息\t\t\t|\n");//已完成
printf("|\t4.管理员登陆\t\t\t|\n");//已完成
printf("|\t5.退出登陆\t\t\t|\n");//已完成
printf("+---------------------------------------+\n");//已完成
scanf("%d",&sel);
switch(sel)
{
case 1: {
client_join();
};
break;
case 2: {
int r = enroll_user();
if(r == -1)
{
printf("按0重新返回登录界面,按其他任意键退出系统\n");
scanf("%d",&sel);
if(sel != 0)
return;
}
}
break;
case 3: {
printf("请输入注销的id\n");
scanf("%d",&sel);
logout_id(sel);
printf("按0重新返回登录界面,按其他任意键退出系统\n");
scanf("%d",&sel);
if(sel != 0)
return;
}break;
case 4: souper_user_join();break;
case 5: {
printf("欢迎下次登录\n");
return;
}
}
}
}
int main()
{
sqlite_init();
Choose();
sqlite_uninit();
}