基于嵌入式Linux系统的图书信息查询数据库的应用设计.docx
- 文档编号:22788997
- 上传时间:2023-04-27
- 格式:DOCX
- 页数:33
- 大小:98.88KB
基于嵌入式Linux系统的图书信息查询数据库的应用设计.docx
《基于嵌入式Linux系统的图书信息查询数据库的应用设计.docx》由会员分享,可在线阅读,更多相关《基于嵌入式Linux系统的图书信息查询数据库的应用设计.docx(33页珍藏版)》请在冰豆网上搜索。
基于嵌入式Linux系统的图书信息查询数据库的应用设计
*******************
实践教学
*******************
兰州理工大学
计算机与通信学院
2015年春季学期
嵌入式系统开发课程设计
题目:
基于嵌入式Linux系统的图书信息查询数据库的应用设计
专业班级:
xxxx工程12级x班
姓名:
xxxxx
学号:
122x0xxx
指导教师:
xxxxxx
成绩:
目录
摘要2
前言3
一、基本原理4
1.1开发环境搭建4
1.2应用程序的编写5
二、系统分析6
2.1需求分析6
2.2控制台7
2.3添加图书信息7
2.4删除图书信息8
2.5查看图书信息9
2.5.1索书号查找9
2.5.2图书名查找10
2.6帮助系统10
2.7退出系统11
三、详细设计12
3.1main.c源码12
3.2consoleshell.c源码12
3.3SQLite.c源程序14
3.4编译源程序22
3.5NFS挂载实验目录测试23
运行结果25
参考文献27
总结28
摘要
随着社会的进步,如今书店图书数量巨大,每天都有大量的图书售出,在如此多的书中查找到自己想要的书采用计算机图书信息查询系统较为快捷,基于嵌入式Linux系统的图书信息查询数据库的应用是在嵌入式数据库Sqlite的基础上,采用C语言编程及SqliteC接口来控制数据库Sqlite的读取和存储,使用C语言编写的人机交互界面使得普通人能够很轻松的对图书信息查询应用进行操作,使得添加、修改、查找和删除图书信息方便快捷。
关键词:
图书信息嵌入式LinuxSqliteC语言
前言
目前各大书店存书量巨大,对于在如此大量的图书中查找到顾客所需的图书,普遍采用计算机软件结合数据库的图书信息查询系统来查找图书信息。
数据库的目标是实现对数据的存储、检索等功能。
传统的数据库产品除提供了基本的查询、添加、删除等功能外,也提供了很多高级特性,如触发器、存储过程、数据备份恢复等。
但实际上用到这些高级功能的时候并不多,应用中频繁用到的还是数据库的基本功能。
于是,在一些特殊的应用场合,传统的数据库就显得过于臃肿了。
在这种情况下,嵌入式数据库开始崭露头角。
嵌入式数据库是一种具备了基本数据库特性的数据文件,它与传统数据库的区别是:
嵌入式数据库采用程序方式直接驱动,而传统数据库则采用引擎响应方式驱动。
嵌入式数据库的体积通常都很小,这使得嵌入式数据库常常应用在移动设备上。
由于性能卓越,所以在高性能的应用上也经常见到嵌入式数据库的身影。
SQLite是一种采用C语言开发的嵌入式数据库。
SQLite的目标是尽量简单,因此它抛弃了传统企业级数据库的种种复杂特性,只实现那些对于数据库而言非常必要的功能。
尽管简单性是SQLite追求的首要目标,但是其功能和性能都非常出色。
通过C语言函数编写的人机交互界面,人工输入所有图书信息,再进行保存,也可以通过图书信息查询系统快速查找到相关图书的信息,对图书信息的修改和删除也非常的方便。
一、基本原理
1.1开发环境搭建
进行嵌入式系统开发之前需要搭建开发环境,所需要的硬件有UP-CUP210-II型嵌入式实验平台,PC机Pentium500以上,硬盘40G以上,内存大于256M,软件部分有VmwareWorkstation+FedoraCore14+MiniCom/Xshell+ARM-LINUX交叉编译开发环境。
准备好硬件后,使用串口线和网线连接UP-CUP210-II型嵌入式实验平台和计算机,并将UP-CUP210-II型嵌入式实验平台接通电源。
1、打开虚拟机启动FedoraCore14,点击【编辑】→【虚拟网络编辑器】,在【桥接到:
】后选择【RealtekPCIeGBEFamilyController】这一项。
然后点击【系统】→【管理】→【网络】→【设备】→【硬件设备】,在【硬件设备】中选择【eth2(……)】这一项,再点击【探测】,最后点击【确定】退出,在重新打开查看eth2是否处于活跃状态。
处于活跃状态是正常状态,若不是就重复以上步骤知道eth2处于活跃状态。
2、在电脑上安装“超级终端”,安装成功后点击【文件】→【新建连接】,进入属性界面后把端口选为COM1,波特率选为115200,数据位选为8,校验位选为None,停止位选为1,流控选为None,点击【确定】退出。
打开UP-CUP210-II实验板电源,待超级终端上显示完毕后输入命令“ifconfig”查看IP地址,输入命令“ifconfigeth0192.168.160.150”对刚刚查到的IP地址修改为192.168.160.150。
再输入“ifconfig”检查IP地址是否修改成功。
使用命令“ping192.168.160.150”查看实验平台与计算机是否能够通信。
3、进入虚拟机终端,输入命令“suroot”切换到root用户,输入密码“123456”,然后输入命令“setup”弹出对话框,选择【防火墙配置】后选择不启用防火墙。
然后进入【系统服务】,选择不启用ip6tables和iptables,启用network和nfs。
退出对话框后输入命令“servicenetworkrestart”重启网络,每行末都显示确定后输入命令【servicenfsrestart】重启网络文件系统。
待每行末都显示确定后输入命令“vi/etc/exports”弹出文件编辑器,把第一行改为“/UP-CUP210-II192.168.160.*(rw,async,no_root_squash)”,保存并退出。
4、在超级终端中输入命令“mountnfs192.168.160.130:
/UP-CUP210-II/mnt/nfs”挂载。
挂载成功后使用命令“cd”和“ls”进入文件夹“05_sqlite”中,输入命令“./SQLite_test”执行程序。
程序的运行结果会显示到超级终端。
1.2应用程序的编写
进入实验目录,输入命令“cd/UP-CUP210-II/SRC/exp/basic/05_sqlite/”,再输入“ls”查看文件夹“05_sqlite”中的所有文件和文件夹,在文件夹“05_sqlite”中存在三个C文件,分别为SQLite.c、consoleshell.c、main.c。
为了方便快速的编写程序,只需将以上三个C文件进行修改即可,修改好后仔细检查并保存退出。
因修改后的代码没用经过编译,在超级终端执行的文件还是原来的文件,所以要在虚拟机终端中输入命令“makeclean”清除中间代码,重新编译。
然后再输入命令“make”编译。
编译成功后进入超级终端执行修改后的程序,修改后的程序执行结果显示到超级终端。
根据这个原理我们可以对程序进行反复修改,反复在超级终端上测设,最终达到理想的结果。
二、系统分析
2.1需求分析
如今遍布全国大大小小的书店数量巨大,每天都有大量的书籍交易,在一些知名的书店每日销售量惊人,如果书店把图书信息记录到纸质表格中,当遇到大量顾客购书时需要人工查找到图书信息,显然浪费了大量时间,效率低下,严重影响销售额。
所以要提高查询图书信息的效率就必须的采用运行速度高的计算机系统。
当顾客买书时一般都是提供书籍名称,店员通过图书信息查询数据库的应用系统输入书籍名称就能很快的查出书籍的索书号和价格,书店的书都是分区分类摆放的,而且是大区里又分出了很多个小区,每个大区都由不同的数字表示,每个大区里面的小区也是由不同的数字表示,每种图书也由数字表示,这种形式就是树状结构,可以通过一级一级的查找到相应图书,由每种图书的代表数字和上一级区的数字组合就形成了索书号,索书号形如学号,例如兰州理工大学学生学号“12250135”,“12”代表2012级的所有学生,“25”代表通信工程的所有学生,“01”代表通信工程一班,“35”就代表某个学生自己。
通过学号从前往后就能知道某学生所属的班级。
索书号也是如此,通过索书号也能查到图书在书店的具体位置。
所以索书号是图书信息查询数据库的应用系统中必不可少的一个信息项。
当人们购买图书是还会考虑到图书的价格,如果价格合适才会去购买。
所以图书价格也是图书信息查询数据库的应用系统中必不可少的一个信息项,图书信息查询数据库的应用系统需要根据图书名称查找图书信息,所以图书名称更是图书信息查询数据库的应用系统中必须的一个信息项。
总体来说图书信息查询数据库的应用系统的数据库中要包括索书号、图书名称和图书价格这三类信息,为了方便人工操作需要有一个简单的人机交互界面——控制台,交互界面菜单应包括添加、删除、查看、帮助和退出功能。
图2.1软件结构图
2.2控制台
控制台是计算机与人之间交互的一个平台,里面含有若干选项,通过点击这些选项就能进入到相应的功能项下,控制台是图书信息查询数据库的应用系统中重要的组成部分。
包含“查看所有图书信息”、“根据图书名查找图书”、“根据索书号查找图书”、“添加图书信息”、“删除图书信息”、“帮助”和“退出”这几个选项。
由于选项信息太长,才用输入简短指令的方法选取选项最为方便快捷。
所以这里以“1”、“2”、“3”、“4”、“5”、“**”和“0”分别作为这几个选项的命令。
2.3添加图书信息
图2.2添加图书信息程序流程图
刚刚建立的图书信息查询数据库的应用系统数据库为空,第一步通过人工输入图书信息,输入顺序是先索书号,然后是图书名,最后是图书价格,每一项输入结束后会自动进入下一项输入,当三项都输入完毕后自动进入控制台。
当输入回车键输入结束。
2.4删除图书信息
当书店里的某些图书下架了,这些图书信息在图书信息查询数据库的应用系统的数据库中也没有用处了,所以得删除这些被下架的图书信息。
删除图书信息时要根据图书名查找到图书,若图书不存在则回到控制台,若图书存在则询问是否要删除,经过用户确认后方可删除相应图书信息。
Y
图2.3删除图书信息程序流程图
2.5查看图书信息
查看图书信息分为三种:
查看所有图书信息、根据图书名查找图书信息、根据索书号查找图书信息。
查看所有图书信息时输入“1”命令则显示数据库中所有的图书信息,实现较为简单。
2.5.1索书号查找
图2.4索书号查找程序流程图
根据索书号查找图书时,首先要输入索书号,若索书号输入完毕,则进行数据库查询,若相关图书不存在则返回控制台,若存在则显示相关图书信息。
2.5.2图书名查找
图2.5图书名查找程序流程图
根据图书名查找图书时,首先要输入图书名,若图书名输入完毕,则进行数据库查询,若相关图书不存在则返回控制台,若存在则显示相关图书信息。
2.6帮助系统
帮助系统是任何一个计算机系统所必须的一部分,主要作用是引导和帮助用户了解系统的功能和操作方法。
图书信息查询数据库的应用系统的帮助系统主要用来向用户说明“1”、“2”、“3”、“4”、“5”、“**”和“0”这几个命令的作用,了解了各个命令的作用后用户才能熟练的操作图书信息查询数据库的应用系统。
2.7退出系统
在每一个计算机系统中都要有退出选项,如果在不使用应用程序时不退出程序容易浪费系统资源。
再运行其他程序时,系统负荷增大,导致运行速度变慢。
功耗增大,耗电量也增大。
在嵌入式设计中如果不设计退出选项,就无法输入其他选项,所以退出系统程序是必不可少的。
三、详细设计
3.1main.c源码
#include"consoleshell.h"
#include"linuxpatch.h"
intmain(intargc,char**argv)
{
consoleshell();
return0;
}
3.2consoleshell.c源码
consoleshell.c源文件主要是建立用户终端显示控制台菜单,并根据用户的输入字符,调用相应的接口函数。
#include"consoleshell.h"
charshell_s[]="\nshell>";
voidget_line(char*cmd);
/**
**
**控制台
**
*/
void*consoleshell(){
intcount=0;
inti;
charcmd[256]={0,};
intrc=sqliteDB_open();
charname[40],id[40];
intprice=0;//demo中只做整型的,浮点型的转换可以参考网上实现
printf("\n
printf("\n[1]查看所有图书信息");
printf("\n[2]根据书名查找图书");
printf("\n[3]根据书号查找图书");
printf("\n[4]删除图书信息");
printf("\n[5]添加图书信息");
printf("\n[**]帮助");
printf("\n[0]退出");
while
(1){
printf(shell_s);
fflush(stdout);
get_line(cmd);
if(strncmp("1",cmd,1)==0){
sqliteDB_opt_select_all();
}elseif(strncmp("2",cmd,1)==0){
printf("\n输入图书名");
printf("\n图书名:
");
scanf("%s",name);
fflush(stdin);//刷新缓冲区
if(!
sqliteDB_exist(name))
continue;
sqliteDB_opt_select(name);
}elseif(strncmp("3",cmd,1)==0){
printf("\n输入索书号");
printf("\n索书号:
");
scanf("%s",id);
fflush(stdin);//刷新缓冲区
sqliteDB_opt_select_by_id(id);
}elseif(strncmp("4",cmd,1)==0){
printf("\n请输入将要删除的图书名");
printf("\n图书名:
");
scanf("%s",name);
fflush(stdin);//刷新缓冲区
if(!
sqliteDB_exist(name))
continue;
sqliteDB_opt_select(name);
//删除之前应再次询问是否删除,不可回滚
sqliteDB_opt_delete(name);
}elseif(strncmp("5",cmd,1)==0){
printf("\n请输入将要添加的图书信息!
\n索书号:
");
printf("\n输入图书索书号");
printf("\n索书号:
");
scanf("%s",id);
printf("\n图书名:
");
scanf("%s",name);
fflush(stdin);//刷新缓冲区
printf("\n价格:
");
scanf("%d",&price);
fflush(stdin);//刷新缓冲区
sqliteDB_opt_add(name,id,price);
}elseif(strncmp("**",cmd,2)==0){
printf("\n
printf("\n[1]查看所有图书信息");
printf("\n[2]根据书名查找图书");
printf("\n[3]根据书号查找图书");
printf("\n[4]删除图书信息");
printf("\n[5]添加图书信息");
printf("\n[**]帮助");
printf("\n[0]退出");
}elseif(strncmp("0",cmd,1)==0){
sqliteDB_close();//关闭数据库连接
break;
//}elseif(cmd[0]!
="0"){
}elseif(strncmp("0",cmd,1)!
=0){
system(cmd);
}
}
}
voidget_line(char*cmd){
inti=0;
while
(1){
cmd[i]=getchar();
if(cmd[i]==10){
cmd[i]=0;
break;
}
fflush(stdout);
i++;
}
}
3.3SQLite.c源程序
该源码文件主要是对SQLite数据的C/C++接口封装,提供consoleshell.c中程序调用。
#include"SQLite.h"
/**
**
**@autherlyj_uptech@
**@date2007-3-21
**//本程序提供了对数据库进行操作的基本接口,对于更复杂的操作,用户可以根据具体情况
**进行修改,程序的更新,以及其他需求请联系本人或者技术支持
**
**例如关于主键的唯一性。
用户可以适当添加功能;
**
**对于可以访问所有table的动态sql语句可以参考其中的程序实现;
**/
sqlite3*db;//全局的数据连接
//用户第一次打开数据库时应创建对应的table并添加适当的数据记录
staticintcallback(void*NotUsed,intargc,char**argv,char**azColName);
/**
*
*建立与数据库的连接
*
*
*/
intsqliteDB_open(){
intrc;//操作标志
printf("\ncreatdatabase:
test.db\n\ncreattable:
tablemerchandise(contents:
idnameprice)\n\nandaddtworecords\n");
rc=sqlite3_open("test.db",&db);
if(rc){
fprintf(stderr,"不能打开数据库:
%s\n",sqlite3_errmsg(db));
sqlite3_close(db);
exit
(1);
}
printf("\n打开成功!
");
if(!
sqliteDB_create_table())
printf("\n数据表存在");
/*
if(!
sqliteDB_insert_records())
printf("\n进入数据表失败");
elsesqliteDB_opt_select_all();
*/
return1;
}
/**
*
*关闭与数据库的连接
*
*/
intsqliteDB_close(){
if(db!
=0)
sqlite3_close(db);
}
/**
*
*添加一条记录到已知或未知数据库表
*
*/
intsqliteDB_opt_add(char*name,char*id,intprice){
intrc;
char*zErrMsg=0;
char*sql=0;//动态生成的SQL语句
chartem_sql[256]="insertintomerchandisevalues('";
//bysprifeformemout
chartem_sql0[5]="','";
chartem_sql1[5]="',";
chartem_sql2[5]=");";
chartem_price[20];
sprintf(tem_price,"%d",price);//将int数据转换为字符串
sql=strcat(tem_sql,name);
sql=strcat(sql,tem_sql0);
sql=strcat(sql,id);
sql=strcat(sql,tem_sql1);
sql=strcat(sql,tem_price);
sql=strcat(sql,tem_sql2);
//printf("\n###############################");
//printf("\n%s",sql);
//printf("\n###############################");
rc=sqlite3_exec(db,sql,callback,0,&zErrMsg);
//printf("\nrc=%d",rc);
if(rc!
=SQLITE_OK){
fprintf(stderr,"SQLerror:
%s\n",zErrMsg);
sqlite3_free(zErrMsg);
}
}
/**
*
*删除表中的一条记录
*@paramname
*/
intsqliteDB_opt_delete(char*name){
intrc;
charn[4];
char*zErrMsg=0;
char*sql=0;//动态生成的SQL语句
chartem_sql[256]="deletefrommerchandisewherename='";//
chartem_sql0[3]="'";
chartem_sql1[3]=";";
//删除之前查询该条记录,如存在则显示该记录,并询问是否真的要删除
//如不存在则推出本次操作
sql=strcat(tem_sql,name);
sql=strcat(sql,tem_sql0);
sql=strcat(sql,tem_sql1);
//printf("\n###############################");
//printf("\n%s",sql);
//printf("\n###############################");
rc=sqlite3_exec(db,sql,callback,0,&zErrMsg);
//printf("\nrc=%d",rc);
if(rc!
=SQLITE_OK){
fprintf(stderr,"SQLerror:
%s\n",zErrMsg);
sqlite3_free(zErrMsg);
}
}
/**
*
*删除表中的一条记录
*@paramid
*/
intsqliteDB_opt_delete_by_id(char*id){
intrc;
charn[4];
char*zErrMsg=0;
char*sql=0;//动态生成的SQL语句
chartem_sql[256]
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 嵌入式 Linux 系统 图书 信息 查询 数据库 应用 设计