Linux与嵌入式系统课程设计基于嵌入式Linux系统的学生考勤数据库应用设计.doc

上传人:文库蛋蛋多 文档编号:2387994 上传时间:2023-02-17 格式:DOC 页数:35 大小:127KB
返回 下载 相关 举报
Linux与嵌入式系统课程设计基于嵌入式Linux系统的学生考勤数据库应用设计.doc_第1页
第1页 / 共35页
Linux与嵌入式系统课程设计基于嵌入式Linux系统的学生考勤数据库应用设计.doc_第2页
第2页 / 共35页
Linux与嵌入式系统课程设计基于嵌入式Linux系统的学生考勤数据库应用设计.doc_第3页
第3页 / 共35页
Linux与嵌入式系统课程设计基于嵌入式Linux系统的学生考勤数据库应用设计.doc_第4页
第4页 / 共35页
Linux与嵌入式系统课程设计基于嵌入式Linux系统的学生考勤数据库应用设计.doc_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《Linux与嵌入式系统课程设计基于嵌入式Linux系统的学生考勤数据库应用设计.doc》由会员分享,可在线阅读,更多相关《Linux与嵌入式系统课程设计基于嵌入式Linux系统的学生考勤数据库应用设计.doc(35页珍藏版)》请在三一办公上搜索。

1、*实践教学*兰州理工大学计算机与通信学院2014年秋季学期Linux与嵌入式系统课程设计题 目: 基于嵌入式Linux系统的学生考勤数据库应用设计 专业班级: 物联网工程12级01班 姓 名: 学 号: 指导教师: 成 绩: 目录摘要2前言3一、嵌入式数据库系统的基本原理41.1 SQLite具有的特点:41.2 SQLite的SQL语法413 SQLite C/C+接口6二、嵌入式学生考勤数据库系统分析92.1 程序流程图.92.2目的及意义10三、嵌入式学生考勤数据库系统详细设计113.1 总体软件结构图11图2 总体软件结构图113.2 程序源代码12四、结果分析28五 详细设计3051

2、、进入实验目录:305.2、清除中间代码,重新编译305.3 NFS挂载实验目录测试31参考文献32结 论33致 谢34摘要本次课设进行了基于嵌入式Linux系统的学生考勤数据库应用设计,实现了对学生考勤数据的查找,按姓名和学号查找,添加新的数据,删除已存在的数据等操作。使它可以对数据库数据进行一系列操作及查看。本课程设计利用实验室提供的ARM6410试验箱进行相应的设计,主要利用了pc机虚拟机和超级终端,AEM-LINUX开发环境,在UP-CUO210-II平台上进行操作,掌握嵌入式数据sqlite的基本方法,理解Linux下sqlite的基本使用方法,API接口函数,sqlite语法,掌握

3、C语言编程的实现。关键词:嵌入式、数据库、sqlite、API接口函数、前言嵌入式数据库通常与操作系统和具体应用集成在一起,无需独立运行的数据库引擎,由程序直接调用相应的API去实现数据库的存取操作,嵌入式数据库是一种具备了基本数据库特性的数据文件,它与传统数据库的区别是:嵌入式数据库采用程序方式直接驱动,而传统数据库则采用引擎响应方式驱动。嵌入式数据库的体积通常都很小,这使得嵌入式数据库常常应用在移动设备上。由于性能卓越,所以在高性能的应用上也经常见到嵌入式数据库的身影。SQLite有以下特性:支持ACID事务,零配置无需安装和管理配置,存储在单一磁盘文件中的一个完整的数据库,数据库文件可以

4、在不同字节顺序的机器间自由共享,比目前流行的大多数数据库的操作要快,提供了对事务功能和并发处理的支持。SQLite是一种采用C语言开发的嵌入式数据库。SQLite的目标是尽量简单,因此它抛弃了传统企业级数据库的种种复杂特性,只实现那些对于数据库而言非常必要的功能。尽管简单性是SQLite追求的首要目标,但是其功能和性能都非常出色。一、 嵌入式数据库系统的基本原理1.1 SQLite具有的特点:1. ACID事务 2. 零配置 无需安装和管理配置 3. 储存在单一磁盘文件中的一个完整的数据库 4. 数据库文件可以在不同字节顺序的机器间自由的共享 5. 支持数据库大小至2TB 6. 足够小, 大致

5、3万行C代码, 250K 7. 比一些流行的数据库在大部分普通数据库操作要快 8. 简单, 轻松的API 9. 包含TCL绑定, 同时通过Wrapper支持其他语言的绑定 10. 良好注释的源代码, 并且有着90%以上的测试覆盖率 11. 独立: 没有额外依赖 12. Source完全的Open, 你可以用于任何用途, 包括出售它 13. 支持多种开发语言,C, PHP, Perl, Java, ASP.NET,Python由于SQLite具有功能强大、接口简单、速度快、占用空间小这样一些特殊的优点,因此特别适合于应用在嵌入式环境中。SQLite在手机、PDA、机顶盒等设备上已获得了广泛应用。

6、1.2 SQLite的SQL语法SQLite库可以解析大部分标准SQL语言。但它也省去了一些特性并且加入了一些自己的新特性。SQLite执行如下的语法ALTER TABLE ANALYZE ATTACH DATABASE BEGIN TRANSACTION 注释 COMMIT TRANSACTION COPY CREATE INDEX CREATE TABLECREATE TRIGGER CREATE VIEW DELETE DETACH DATABASE DROP INDEX DROP TABLE DROP TRIGGER DROP VIEW END TRANSACTION EXPLAIN

7、表达式 INSERT ON CONFLICT子句 PRAGMA REINDEX REPLACE ROLLBACK TRANSACTION SELECT UPDATE VACUUM13 SQLite C/C+接口由于早期的SQLite只支持5个C/C+接口,因而非常容易学习和使用,但是随着SQLite功能的增强,新的C/C+接口不断的增加进来,到现在有超过150个不同的API接口。这往往使初学者望而却步。幸运的是,大多数SQLite中的C/C+接口是专用的,因而很少被使用到。尽管有这么多的调用接口,核心的API仍然相对简单和便于调用。以下举例常用的SQLite数据库与用户应用程序C/C+接口sq

8、lite3_open()该接口打开与一个SQLite数据库文件的连接并返回一个数据库连接对象。这通常是应用程序调用的第一个SQLite API接口而且也是调用其他SQLite API接口前需要调用的接口。许多SQLite接口需要一个指向数据库连接对象的指针作为它们的第一个参数,因而这些接口也可以理解成是数据库连接对象的操作接口。该接口就是创建了这样一个数据库连接对象。sqlite3_prepare()该接口把一个SQL语句文本转换成一个预处理语句对象并返回一个指向该对象的指针。这个接口需要一个由先前调用sqlite3_open()返回的数据库连接对象指针以及一个预处理的SQL语句文本字符串为参

9、数。这个API并不实际解析SQL语句,仅仅是为后续的解析而对SQL语句进行的预处理。sqlite3_step()该接口用于解析一个由先前通过sqlite3_prepare()接口创建的预处理语句,直至返回第一列结果为止。通过再次调用sqlite3_step()可以返回下一列的结果,继续不断地调用sqlite3_step()直至整个语句完成为止。对于那些并不返回结果的语句(例如:INSERT,UPDATE,DELETE语句)一次调用sqlite3_step()就完成了语句的处理。sqlite3_column()该接口返回一个由sqlite3_step()解析的预处理语句结果集中当前行的某一列数据

10、。每次执行sqlite3_step()都返回一个新的结果集中的一行。可以多次调用sqlite3_column()接口返回那一行中所有列的数据。就像上面所说的那样,SQLite API中并没有sqlite3_column()这样的接口。取而代之的是一组用于从结果集中查询出各个列项各种数据类型数据的函数接口。在这组函数接口中,有些接口返回结果集的大小,有些返回结果集的列数。- sqlite3_column_blob() - sqlite3_column_bytes() - sqlite3_column_bytes16() - sqlite3_column_count() - sqlite3_col

11、umn_double() - sqlite3_column_int() - sqlite3_column_int64() - sqlite3_column_text() - sqlite3_column_text16() - sqlite3_column_type() - sqlite3_column_value()sqlite3_finalize()该接口销毁之前调用sqlite3_prepare()创建的预处理语句。每一个预处理语句都必须调用这个接口进行销毁以避免内存泄漏。sqlite3_close()该接口关闭一个由之前调用sqlite3_open()创建的数据库连接。所有与该连接相关的

12、预处理语句都必须在关闭连接之前销毁。一个应用程序可以通过执行以下几个步骤执行一条SQL语句:(1) 使用sqlite3_prepare()创建一个预处理语句。(2) 重复调用sqlite3_step()解析执行预处理语句。(3) 对于查询操作,两次调用sqlite3_step()之间通过sqlite3_column()接口查询返回的结果。(4) 最后,使用sqlite3_finalize()销毁预处理语句。上述就是有效使用SQLite所需要知道的知识,其余的仅仅是些需要补充的细节而已。sqlite3_exec()该接口是执行上述四个步骤的一个方便的应用调用封装接口,传递给sqlite3_exe

13、c()的回调函数用于处理每一列返回的结果集。、二、 嵌入式学生考勤数据库系统分析开始菜单输入等于1等于2等于3等于4等于5= *查找所有姓名查找号码查找删除记录添加记录返回菜单输入输入输入输入退出调用函数等于02.1程序流程图: 存在输出合法存在存在调用函数调用函数调用函数调用函数输出存入数据库输出输出图1 程序流程图2.2目的及意义嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可定制,适用于不同应用场合,对功能,可靠性,成本,体积,功耗有严格要求的专用计算机系统。它一般由嵌入式微处理器,外围硬件设备,嵌入式操作系统,用户应用程序4个部分组成。用于实现对其他设备的控制,监视或管理等功能。

14、嵌入式系统已经广泛应用于科学研究,工业控制,军事技术,交通通信,医疗卫生,消费娱乐等领域,人们常用的手机,PDA,汽车,智能家电,GPS等均是嵌入式系统的典型代表。本课程设计要求利用实验室提供的ARM6410试验箱进行相应的设计,主要包括了解Linux环境下搭建嵌入式数据sqlite的基本方法,理解Linux下sqlite的基本使用方法,API接口函数,sqlite语法,掌握C语言编程的实现。2.3设计任务及要求利用 ARM6410实验箱和C语言来实现。完成如下的工作:1 熟悉ARM6410实验箱;2 掌握C语言的编程思路;3 了解嵌入式数据库SQLite在嵌入式中的应用4 编写用户应用程序对

15、嵌入式数据库的访问和交互;5 验证结果。三、 嵌入式学生考勤数据库系统详细设计3.1 总体软件结构图main.cconsoleshell.csqliteDB_close()sqliteDB_open()sqliteDB_opt_delete_by_number(char *number)sqliteDB_opt_delete(char *name)sqliteDB_opt_select(char *name)sqliteDB_opt_select_by_number(char *number)sqliteDB_opt_add(char *name,char *number,char *depa

16、rtment)sqliteDB_opt_select_all()SQLite.c图2 总体软件结构图3.2 程序源代码#include #include ./sqlite/sqlite3.h#include #include#ifndef false #define false 0#endif#ifndef true #define true 1#endif_const unsigned short int *_ctype_b;_const _int32_t *_ctype_tolower;_const _int32_t *_ctype_toupper;char shell_s=nshell

17、;void get_line(char *cmd);/* * * /本程序提供了对数据库进行操作的基本接口,对于更复杂的操作,可以根据具体情况进行修改* 对于可以访问所有table的动态sql语句可以参考其中的程序实现;*/sqlite3 *db;/全局的数据连接/用户第一次打开数据库时应创建对应的table并添加适当的数据记录static int callback(void *NotUsed, int argc, char *argv, char *azColName);/* *建立与数据库的连接* */int sqliteDB_open()int rc;/操作标志printf(ncreat

18、 database:test.dbnncreat table:table student(contents:number name department )nnand add two recordsn);rc = sqlite3_open(test.db, &db);if( rc )fprintf(stderr, Cant open database: %sn, sqlite3_errmsg(db);sqlite3_close(db);exit(1);printf(nOpen sucess!);if(!sqliteDB_create_table()printf(ntable exist);/*

19、if(!sqliteDB_insert_records()printf(ninsert table faild); else sqliteDB_opt_select_all();*/return 1;/* 关闭与数据库的连接 */int sqliteDB_close()if(db != 0) sqlite3_close(db);/* 添加一条记录到已知或未知数据库表*/int sqliteDB_opt_add(char *name,char *number,char *department)int rc;char *zErrMsg = 0;char *sql=0;/动态生成的SQL语句char

20、 tem_sql256=insert into student values(;/ by sprife for mem outchar tem_sql05 = ,; char tem_sql15 = ,; char tem_sql25 = );sql = strcat(tem_sql,name);sql = strcat(sql,tem_sql0);sql = strcat(sql,number);sql = strcat(sql,tem_sql1);sql = strcat(sql,department);sql = strcat(sql,tem_sql2);/printf(n#);/pri

21、ntf(n%s,sql);/printf(n#);rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);/printf(n rc = %d,rc);if( rc!=SQLITE_OK )fprintf(stderr, SQL error: %sn, zErrMsg);sqlite3_free(zErrMsg);/* 删除表中的一条记录* param name*/int sqliteDB_opt_delete(char *name)int rc;char n4;char *zErrMsg = 0;char *sql=0;/动态生成的SQL语句char

22、 tem_sql256=delete from student where name = ;/char tem_sql03 = ;char tem_sql13 = ;/删除之前查询该条记录,如存在则显示该记录,并询问是否真的要删除 /如不存在则推出本次操作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);

23、/printf(n rc = %d,rc);if( rc!=SQLITE_OK )fprintf(stderr, SQL error: %sn, zErrMsg);sqlite3_free(zErrMsg);/* 删除表中的一条记录* */int sqliteDB_opt_delete_by_number(char *number)int rc;char n4;char *zErrMsg = 0;char *sql=0;/动态生成的SQL语句char tem_sql256=delete from student where number = ;/char tem_sql03 = ;char t

24、em_sql13 = ;/删除之前查询该条记录,如存在则显示该记录,并询问是否真的要删除 /如不存在则推出本次操作sql = strcat(tem_sql,number);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(n rc = %d,rc);if( rc!=SQLITE_OK )fprintf(stderr, SQL error: %

25、sn, zErrMsg);sqlite3_free(zErrMsg);/*/* 用预编译的sql语句减少sql语句的分析时间* 查询语句*/int sqliteDB_opt_select_all()sqlite3_stmt* stmt=NULL; char* zErrMsg=NULL; char *name,*number,*department; int nret=sqlite3_prepare(db,SELECT * FROM student;,strlen(SELECT * FROM student;),&stmt,(const char*)(&zErrMsg);if(nret!=SQL

26、ITE_OK) return false; printf(ntnamettnumberttdepartmentn); printf(t-n); while(1) nret=sqlite3_step(stmt); if(nret!=SQLITE_ROW) break; name=sqlite3_column_text(stmt,0); number=sqlite3_column_text(stmt,1); department=sqlite3_column_text(stmt,2); printf(t%stt%stt%sn,name,number,department); sqlite3_fin

27、alize(stmt); printf(n); return true;/* 查询符合查询条件的记录* */int sqliteDB_opt_select(char *name)sqlite3_stmt* stmt=NULL; char* zErrMsg=NULL; char *_name,*_number,*_department; int nret=0;int rc;char *sql=0;/动态生成的SQL语句char tem_sql256=select * from student where name = ;/char tem_sql03 = ;char tem_sql13 = ;s

28、ql = strcat(tem_sql,name);sql = strcat(sql,tem_sql0);sql = strcat(sql,tem_sql1);/printf(n#);/printf(n%s,sql);/printf(n#);nret=sqlite3_prepare(db,sql,strlen(sql),&stmt,(const char*)(&zErrMsg);if(nret!=SQLITE_OK)return false; printf(ntnamettnumberttdepartmentn); printf(t-n); while(1) nret=sqlite3_step

29、(stmt); if(nret!=SQLITE_ROW) break; _name=sqlite3_column_text(stmt,0); _number=sqlite3_column_text(stmt,1); _department=sqlite3_column_text(stmt,2); printf(t%stt%stt%sn,_name,_number,_department); sqlite3_finalize(stmt);printf(n);return true;/* 查询符合查询条件的记录* */int sqliteDB_opt_select_by_number(char *

30、number)sqlite3_stmt* stmt=NULL; char* zErrMsg=NULL; char *_name,*_number,*_department; int nret=0;int rc;char *sql=0;/动态生成的SQL语句char tem_sql256=select * from student where number = ;/char tem_sql03 = ;char tem_sql13 = ;sql = strcat(tem_sql,number);sql = strcat(sql,tem_sql0);sql = strcat(sql,tem_sql1

31、);/printf(n#);/printf(n%s,sql);/printf(n#);nret=sqlite3_prepare(db,sql,strlen(sql),&stmt,(const char*)(&zErrMsg);if(nret!=SQLITE_OK)return false; printf(ntnamettnumberttdepartmentn); printf(t-n); while(1) nret=sqlite3_step(stmt); if(nret!=SQLITE_ROW) break; _name=sqlite3_column_text(stmt,0); _number

32、=sqlite3_column_text(stmt,1); _department=sqlite3_column_text(stmt,2); printf(t%stt%stt%sn,_name,_number,_department); sqlite3_finalize(stmt);printf(n);return true;/*内部调用函数*/static int callback(void *NotUsed, int argc, char *argv, char *azColName) int i; for(i=0; iargc; i+) printf(%s = %sn, azColNam

33、ei, argvi ? argvi : NULL); printf(n); return 0;/*内部调用函数*功能判断所查询的记录是否存在* */int sqliteDB_exist(char *name)sqlite3_stmt* stmt=NULL; char* zErrMsg=NULL; char *_name,*_department; int nret=0;int rc;char *sql=0;/动态生成的SQL语句char tem_sql256=select * from student where name = ;/char tem_sql03 = ;char tem_sql1

34、3 = ;sql = strcat(tem_sql,name);sql = strcat(sql,tem_sql0);sql = strcat(sql,tem_sql1);nret=sqlite3_prepare(db,sql,strlen(sql),&stmt,(const char*)(&zErrMsg);printf(sql: %s,sql);if(nret!=SQLITE_OK)return false;nret=sqlite3_step(stmt);if(nret!=SQLITE_ROW)printf(n this record does not exist!);return fal

35、se;sqlite3_finalize(stmt);return true;/*在用户还没有创建table时可用该函数创建一个table*/int sqliteDB_create_table()char* zErrMsg=NULL; char sql256=CREATE TABLE student(name varchar(40),number varchar(40),department varchar(40);int nret=sqlite3_exec(db,sql,NULL,NULL,&zErrMsg); if(nret!=SQLITE_OK) printf(%sn,sqlite3_er

36、rmsg(db); return false; else return true;/*初始化数据库table时预插入两条数据*/int sqliteDB_insert_records() char* zErrMsg=NULL; char sql1256=INSERT INTO student VALUES(ibm,277325073,483); char sql2256=INSERT INTO student VALUES(sun,433443,400); int nret=sqlite3_exec(db,sql1,NULL,NULL,&zErrMsg); nret=sqlite3_exec(

37、db,sql2,NULL,NULL,&zErrMsg); if(nret!=SQLITE_OK) printf(%sn,sqlite3_errmsg(db); return false; else return true;/*控制台*/void * consoleshell()int count=0;int i;char cmd256=0,;int rc = sqliteDB_open();char name40,number40,department40;printf(n);printf(n 1 select all the records in table student);printf(

38、n 2 select the the record which you known its name);printf(n 3 select the record by the number);printf(n 4 delete record);printf(n 5 add record);printf(n * help menu);printf(n 0 print the end of the context an exit);while(1)printf(shell_s);fflush(stdout);get_line(cmd);if(strncmp(1,cmd,1)=0)sqliteDB_opt_select_all();else if(strncmp(2,cmd,1)=0)printf(nenter the record name ); printf(nname:); scanf(%s,name); fflush(stdin);/刷新缓冲区 if(!sqliteDB_exist(name)continue;sqliteDB_opt_select(name);else if(strncmp(3,cmd,1)=0)printf(nenter the record number );

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号