当前位置:文档之家› 嵌入式系统技术报告(题目 SQLITE数据库的概述和使用)

嵌入式系统技术报告(题目 SQLITE数据库的概述和使用)

合肥学院嵌入式系统设计课程技术报告(2014-2015第2学期)报告题目:SQLite数据库概述和使用专业:自动化班级:级自动化卓越班姓名:指导老师:干开峰摘要自几十年前出现的商业应用程序以来,数据库就成为软件应用程序的主要组成部分。

正与数据库管理系统非常关键一样,它们也变的非常庞大,并占用相当多的系统资源。

嵌入式数据库直接在应用程序进程中运行,提供了零配置运行模式,并且资源占用非常少。

作为一个开源的嵌入式数据库产品,SQLite具有系统开销小,检索效率高的特性,嵌入式数据库无须独立运行的数据库引擎,它是由程序直接调用相应的API去实现对数据的存取操作。

更直白的讲,嵌入式数据库是一种具备了基本数据库特性的数据文件。

嵌入式数据库与其它数据库产品的区别是,前者是程序驱动式,而后者是引擎响应式。

嵌入式数据库的一个很重要的特点是体积非常小,同时,很多嵌入式数据库在性能上也优于其它数据库,所以在高性能的应用上也常见嵌入式数据库的身影。

SQLite是D·理查德·希普开发出来的用一个小型C库实现的一种强有力的嵌入式关系数据库管理体制。

SQLite虽然很小巧,但是支持的SQL语句不会逊色于其他开源数据库。

关键词:SQLite;嵌入式;数据库目录1SQLite简介 (1)2SQLite工作原理 (1)3SQLite的功能特性 (2)4SQLite的结构 (2)5SQLite的使用 (4)5.1SQLite里面的一些基本的操作: (4)5.2SQLite的一些类的使用及说明: (5)5.3SQLite嵌入式数据库使用注意: (10)6总结 (11)1SQLite简介SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。

它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。

SQLite第一个Alpha版本诞生于2000年5月。

至今已经有14个年头,SQLite也迎来了一个版本SQLite3已经发布。

作为一个开源的嵌入式数据库产品,SQLite具有系统开销小,检索效率高的特性,嵌入式数据库无须独立运行的数据库引擎,它是由程序直接调用相应的API去实现对数据的存取操作。

更直白的讲,嵌入式数据库是一种具备了基本数据库特性的数据文件。

嵌入式数据库与其它数据库产品的区别是,前者是程序驱动式,而后者是引擎响应式。

嵌入式数据库的一个很重要的特点是体积非常小,同时,很多嵌入式数据库在性能上也优于其它数据库,所以在高性能的应用上也常见嵌入式数据库的身影。

SQLite是D·理查德·希普开发出来的用一个小型C库实现的一种强有力的嵌入式关系数据库管理体制。

2SQLite工作原理不像常见的客户-服务器范例,SQLite引擎不是个程序与之通信的独立进程,而是连接到程序中成为它的一个主要部分。

所以主要的通信协议是在编程语言内的直接API调用。

这在消耗总量、延迟时间和整体简单性上有积极的作用。

整个数据库(定义、表、索引和数据本身)都在宿主主机上存储在一个单一的文件中。

它的简单的设计是通过在开始一个事务的时候锁定整个数据文件而完成的。

3SQLite的功能特性1.ACID事务2.零配置–无需安装和管理配置3.储存在单一磁盘文件中的一个完整的数据库4.数据库文件可以在不同字节顺序的机器间自由的共享5.支持数据库大小至2TB6.足够小,大致13万行C代码,4.43M7.比一些流行的数据库在大部分普通数据库操作要快8.简单,轻松的API9.包含TCL绑定,同时通过Wrapper支持其他语言的绑定10.良好注释的源代码,并且有着90%以上的测试覆盖率11.独立:没有额外依赖12.源码完全的开源,你可以用于任何用途,包括出售它13.支持多种开发语言,C,C++,PHP,Perl,Java,C#,Python,Ruby 等4SQLite的结构4.1概述SQLite采用了模块的设计,它由三个子系统,包括8个独立的模块构成。

4.2接口(Interface)接口由SQLite C API组成,也就是说不管是程序、脚本语言还是库文件,最终都是通过它与SQLite交互的(我们通常用得较多的ODBC/JDBC最后也会转化为相应C API的调用)。

4.3编译器(Compiler)在编译器中,分词器(Tokenizer)和分析器(Parser)对SQL进行语法检查,然后把它转化为底层能更方便处理的分层的数据结构---语法树,然后把语法树传给代码生成器(code generator)进行处理。

而代码生成器根据它生成一种针对SQLite的汇编代码,最后由虚拟机(Virtual Machine)执行。

4.4虚拟机(Virtual Machine)架构中最核心的部分是虚拟机,或者叫做虚拟数据库引擎(Virtual Database Engine,VDBE)。

它和Java虚拟机相似,解释执行字节代码。

VDBE 的字节代码由128个操作码(opcodes)构成,它们主要集中在数据库操作。

它的每一条指令都用来完成特定的数据库操作(比如打开一个表的游标)或者为这些操作栈空间的准备(比如压入参数)。

总之,所有的这些指令都是为了满足SQL 命令的要求(关于VM,后面会做详细介绍)。

5SQLite的使用5.1SQLite里面的一些基本的操作:5.1.1数据库的创建:const char*gszFile="C:\\test.db";//数据库路径CppSQLite3DB db;remove(gszFile);//清除当前路径的文件db.open(gszFile);//如果数据库存在,则打开数据库,不存在,则创建数据库5.1.2表的创建:在表创建之前,要先进行检测该表是否存在,来避免出现错误:db.tableExists("emp");//返回true则为该表已存在,false为不存在当不存在同名的表,才进行创建db.execDML("create table emp(empno int,empname char(20));");创建完成后,同样可利用db.tableExists("emp")来进行判断,创建是否成功。

5.1.3基本的SQL语句的执行:一般我们通过SQLite里面的execDML来执行SQL语句:db.execDML("update emp set numcalls=10where dayno=1;");在进行增删改等涉及更新数据的操作时,最好是放在事务里面进行操作,一是有效的锁定数据库的使用状态,二是可以进行回滚操作。

如:db.execDML("begin transaction;");db.execDML("update emp set numcalls=10where dayno=1;");db.execDML("commit transaction;");5.1.4数据操作的并发问题SQLite可以允许多个用户或者线程同时执行查询操作,但最多却只允许一个用户在某一个时段进行数据更新操作。

因此,我们在操作数据库的过程中,为了不排除数据库被其他的用户或者线程所占用,我们在使用的过程中,利用try…Catch…来进行捕捉异常,来避免数据库被占用而导致的错误。

try{int nRows=db.execDML("update emp set numcalls=100 where dayno=1;");cout<<"Main thread:updated"<<nRows<<"rows"<< endl;}catch(CppSQLite3Exception&e){cout<<"Main thread:"<< e.errorCode()<<":"<< e.errorMessage()<<endl;}5.2SQLite的一些类的使用及说明:5.2.1CppSQLite3Table:CppSQLite3Table是一个SQLite提供的用来专门存放一个完整的表结构,我们也可以通过CppSQLite3Table里面的一些方法和函数去读取这个表里面的内容。

CppSQLite3Table t=db.getTable("select*from emp;");t.numFields();//返回表里面的总列数t.fieldName(fld);//返回表里面第fld列的列名t.numRows();//返回表里面的总行数t.setRow(i);//i为所在表的第几行t.fieldIsNull(field);//判断第几列是否为空,field是指该行的第几列数据t.fieldValue(field);//读取第i行里面的第field列数据例子:CppSQLite3Table t=db.getTable("select*from emp order by 1;");for(fld=0;fld<t.numFields();fld++){cout<<t.fieldName(fld)<<"|";}cout<<endl;for(int row=0;row<t.numRows();row++){t.setRow(row);for(int fld=0;fld<t.numFields();fld++){if(!t.fieldIsNull(fld))cout<<t.fieldValue(fld)<<"|";elsecout<<"NULL"<<"|";}cout<<endl;}5.2.2CppSQLite3Query:CppSQLite3Query是SQLite里面用来存放查询的返回结果CppSQLite3Query q=db.execQuery("select*from emp order by 1;");q.numFields();//返回这个数据集的总列数q.fieldName(fld);//返回第fld列的列名q.fieldDeclType(fld);//返回第fld列的的数据类型q.fieldValue(0);//返回某一行的第0列的数据q.nextRow();//指向数据集当前行的下一行q.eof();//判断当前行是否为空例子:CppSQLite3Query q=db.execQuery("select*from emp order by 1;");for(fld=0;fld<q.numFields();fld++){cout<<q.fieldName(fld)<<"("<<q.fieldDeclType(fld) <<")|";}cout<<endl;while(!q.eof()){cout<<q.fieldValue(0)<<"|";cout<<q.fieldValue(1)<<"|"<<endl;q.nextRow();}5.2.3CppSQLite3Buffer:CppSQLite3Buffer是SQLite里面提供的一个可包含特殊字符的字符串类型。

相关主题