第 9 章 嵌入式数据库程序设计_第1页
第 9 章 嵌入式数据库程序设计_第2页
第 9 章 嵌入式数据库程序设计_第3页
第 9 章 嵌入式数据库程序设计_第4页
第 9 章 嵌入式数据库程序设计_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第9章嵌入式数据库程序设计,目录,嵌入式数据库概述,1,常用的嵌入式数据库,2,SQLite在Linux主机上的安装,3,SQLiteshell命令,4,sqlite数据库应用程序设计,5,SQLite的API接口,6,嵌入式数据库SQLite的移植,7,嵌入式数据库SQLite与Qt的连接,8,嵌入式数据库概述,1.嵌入式数据库的内涵,嵌入式数据库是一种具备了基本数据库特性的数据文件,它与传统数据库的区别是:嵌入式数据库采用程序方式直接驱动,而传统数据库则采用引擎响应方式驱动。嵌入式数据库的体积通常都很小,这使得嵌入式数据库常常应用在移动设备上。由于性能卓越,所以在高性能的应用上也经常见到嵌入式数据库的身影,嵌入式数据库概述,2.嵌入式数据库的特征,嵌入性实时性可靠性可定制性跨平台,嵌入式数据库概述,3.嵌入式数据库的应用领域及未来趋势,消费电子及网络设备军工和航空航天工业控制,常用的嵌入式数据库,1.BerkeleyDB,嵌入式轻便灵活可伸缩,BerkeleyDB是由美国SleepycatSoftware公司开发的一套开放源码的嵌入式数据库的程序库(databaselibrary),它为应用程序提供可伸缩的、高性能的、有事务保护功能的数据管理服务。BerkeleyDB为数据的存取和管理提供了一组简洁的函数调用API接口。它是一个经典的C-library模式的toolkit,为程序员提供广泛丰富的函数集,是为应用程序开发者提供工业级强度的数据库服务而设计的。,常用的嵌入式数据库,2.SQLite,支持ACID事务。零配置而无需安装和管理配置;储存在单一磁盘文件中的一个完整的数据库;数据库文件可以在不同字节顺序的机器间自由共享;支持数据库大小至2TB;足够小,全部源码大致3万行c代码,250KB;比目前流行的大多数数据库对数据的操作要快;独立,没有额外依赖;SQL语言很大程度上实现了ANSISQL92标准。,SQLite属于轻量级别数据库,它的源代码是C,其源代码完全开放。SQLite第一个Alpha版本诞生于2000年5月。目前的最新版本是SQLite3.5。SQLite有以下特性:,常用的嵌入式数据库,3.eXtremeDB,内存数据库混合数据库嵌入式数据库由应用定制的API可预测的数据管理,eXtremeDB是美国McObject公司的产品。主要特点:,常用的嵌入式数据库,4.Firebird嵌入式数据库,Firebird的嵌入版有如下特色:数据库文件与Firebird网络版本完全兼容,差别仅在于连接方式不同,可以实现零成本迁移。数据库文件仅受操作系统的限制,且支持将一个数据库分割成不同文件,突破了操作系统最大文件的限制,提高了IO吞吐量。完全支持SQL92标准,支持大部分SQL-99标准功能。丰富的开发工具支持,绝大部分基于Interbase的组件,可以直接使用于Firebird。支持事务、存储过程、触发器等关系数据库的所有特性。可自己编写扩展函数(UDF)。,常用的嵌入式数据库,5.mSQL嵌入式数据库,mSQL(miniSQL)是一个单用户数据库管理系统,个人使用免费,商业使用收费。由于它的短小精悍,使其开发的应用系统特别受到互联网用户青睐。mSQL(miniSQL)是一种小型的关系数据库,性能不是太好,对SQL语言的支持也不够完全,但在一些网络数据库应用中是足够了。mSQL的技术特点:安全性方面,mSQL通过ACL文件设定各主机上各用户的访问权限,缺省是全部可读/写。mSQL缺乏ANSISQL的大多数特征,它仅仅实现了一个最最少的API,没有事务和参考完整性。mSQL与Lite(一种类似C的脚本语言,与分发一起发行)紧密结合,可以得到一个称为W3-mSQL的一个网站集成包,它是JDBC、ODBC、Perl和PHPAPI。,SQLite在Linux主机上的安装,先准备好SQLite源码:sqlite-amalgamation-3.5.9.tar.gz解压缩:tarzxvfsqlite-amalgamation-3.5.9.tar.gzC/root/sqlite/for_pc进入sqlite目录:cd/root/sqlite/for_pc/sqlite-amalgamation-3.5.9配置:./configure编译:make安装:makeinstall主要安装了如下文件:/usr/local/include/sqlite3.h/usr/local/include/sqlite3ex.h/usr/local/lib/libsqlite3*/usr/local/bin/sqlite3,SQLiteshell命令,SQLite库包含一个名字叫做sqlite3的命令行,它可以让用户手工输入并执行面向SQLite数据库的SQL命令。命令分为两种:用来管理当前数据库的SQL命令,以分号结束。Shell本身的命令,以点开头,主要用来控制数据的显示模式、设置Shell读取和显示数据的方式及其他系统控制。1sqlite3启动打开名字为“ex1”的SQLite数据库,在终端输入以下命令:sqlite3ex1,SQLiteshell命令,2数据库管理命令在sqlite提示符下可以输入SQL语句对数据库进行操作和管理。,sqlitecreatetabletbl1(onevarchar(10),twosmallint);sqliteinsertintotbl1values(hello!,10);sqliteinsertintotbl1values(goodbye,20);sqliteselect*fromtbl1;hello!|10goodbye|20sqlite,SQLiteshell命令,3Shell本身的命令,(1)常用的显示模式控制命令:.headerON|OFF:设置是否显示数据表格的列名.indicesTABLE:显示表格的所有列名.modeMODE:设置数据表格的显示模式。默认是list,用.separator命令设置的字符串分隔字符(默认是|)。我们比较习惯的是column格式.nullvalueSTRING:当数据为空时,用STRING来填充。默认是空字符串,也就是什么也不显示。.tablesPATTERN:使用PATTERN模式来显示表格.widthNUMNUM.:设置当以column模式显示时,数据显示的宽度.outputFILENAME|stdout:设置数据输出的形式:文件或屏幕的标准输出。.readFILENAME:从文件读取SQL语句(2)其他系统控制命令:.databases:显示目前已经匹配的数据库名称.table:显示当前数据库中的所有表.help:显示shell的帮助信息.show:显示shell目前的设置参数.quit和.exit:退出shell,sqlite数据库应用程序设计,intmain(intargc,char*argv)sqlite3*db;char*zErrMsg=0;intrc;if(argc!=3)fprintf(stderr,Usage:%sDATABASESQL-STATEMENTn,argv0);exit(1);rc=sqlite3_open(argv1,#include#includestaticintcallback(void*NotUsed,intargc,char*argv,char*azColName)inti;for(i=0;iargc;i+)printf(%s=%sn,azColNamei,argvi?argvi:NULL);printf(n);return0;,sqlite数据库应用程序设计,注意:1.编译:gcc-I/usr/local/include-L/usr/local/lib-osqlite_testsqlite_test.c-lsqlite32.运行时需要libsqlite3.so.0共享库cp/usr/local/lib/libsqlite3.so.0/usr/lib/,SQLite的API接口,sqlite提供了一些C函数接口,可以用这些函数操作数据库。通过使用这些接口,传递一些标准SQL语句(以char*类型)给sqlite函数,sqlite就会为你操作数据库。sqlite跟MS的access一样是文件型数据库,就是说,一个数据库就是一个文件,此数据库里可以建立很多的表,可以建立索引、触发器等等,但是,它实际上得到的就是一个文件。备份这个文件就备份了整个数据库。sqlite不需要任何数据库引擎,这意味着如果你需要sqlite来保存一些用户数据,甚至都不需要安装数据库。,SQLite的API接口,1关键数据结构sqlite里最常用到的是sqlite3*类型。从数据库打开开始,sqlite就要为这个类型准备好内存,直到数据库关闭,整个过程都需要用到这个类型。当数据库打开时,这个类型的变量就代表了你要操作的数据库。2打开数据库intsqlite3_open(文件名,sqlite3*);用这个函数开始数据库操作。需要传入两个参数,一是数据库文件名。文件名不需要一定存在,如果此文件不存在,sqlite会自动建立它。如果它存在,就尝试把它当数据库文件来打开;sqlite3*参数即前面提到的关键数据结构。函数返回值表示操作是否正确,如果是SQLITE_OK则表示操作正常。相关的返回值sqlite定义了一些宏。具体这些宏的含义可以参考sqlite3.h文件,里面有详细定义。顺便说一下,sqlite3的代码注释率是非常高的。3.关闭数据intsqlite3_close(sqlite3*);前面如果用sqlite3_open开启了一个数据库,结尾时不要忘了用这个函数关闭数据库。,基本流程API:,SQLite的API接口,1执行sql语句intsqlite3_exec(sqlite3*,constchar*sql,sqlite3_callback,void*,char*errmsg);第1个参数就是前面open函数得到的指针。第2个参数constchar*sql是一条sql语句,以0结尾。第3个参数sqlite3_callback是回调,当这条语句执行之后,sqlite3会去调用这个函数。第4个参数void*是你所提供的指针,你可以传递任何一个指针参数到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,可以填NULL。后面再介绍回调函数的写法,以及这个参数的使用。第5个参数char*errmsg是错误信息。说明:通常,sqlite3_callback和它后面的void*这两个位置都可以填NULL。填NULL表示你不需要回调。比如做insert操作,做delete操作,就没有必要使用回调。而当做select时,就要使用回调,因为sqlite3把数据查出来,得通过回调说明查出了什么数据。,SQL语句操作API:,SQLite的API接口,2exec的回调int(*sqlite3_callback)(void*,int,char*,char*);,SQL语句操作API:,intLoadMyInfo(void*para,intn_column,char*column_value,char*column_name),para是在sqlite3_exec里传入的void*参数。通过para参数,可以传入一些特殊的指针(比如类指针、结构指针),然后在这里面强制转换成对应的类型(这里面是void*类型,必须强制转换成你的类型才可用)。然后操作这些数据。n_column是这一条记录有多少个字段(即这条记录有多少列)。char*column_value是个关键值,查出来的数据都保存在这里,它实际上是个1维数组(不要以为是2维数组),每一个元素都是一个char*值,是一个字段内容(用字符串来表示,以0结尾)。char*column_name跟column_value是对应的,表示这个字段的字段名称,SQLite的API接口,2exec的回调int(*sqlite3_callback)(void*,int,char*,char*);,SQL语句操作API:,intLoadMyInfo(void*para,intn_column,char*column_value,char*column_name),注意:(1)只有sqlite3_exec执行查询操作(select)的时候才会调用此回调函数;(2)查询到多少条记录就会执行多少次回调函数,每次调用回调函数时,其携带的参数只有一条记录。另外注意:column_name和column_value的地址每次都是相同的,*column_name(字段)每次相同,但是,*column_name(记录)每次不同。,SQLite的API接口,char*col_name4;charcol_value100420/最多100条记录;4个字段;一个字串不超过20字符intcol=0;introw=0;staticintcallback(void*NotUsed,intargc,char*argv,char*azColName)inti;col=argc;for(i=0;iargc;i+)/printf(%s=%s!n,azColNamei,argvi?argvi:NULL);strcpy(col_valuerowi,argvi);/col_valuerowi=argvi;col_namei=azColNamei;printf(%s=%s!n,col_namei,col_valuerowi);row+;/printf(aan);return0;,怎样用回调函数获得全部去查询结果:,问题:问什么不用char*col_value1004来定义字符串数组?,voidmainform:myslots()sqlite3*db;char*zErrMsg=0intrc;rc=sqlite3_open(xrs.db,SQLite的API接口,3不使用回调查询数据库intsqlite3_get_table(sqlite3*,constchar*sql,char*resultp,int*nrow,int*ncolumn,char*errmsg);,SQL语句操作API:,第1个参数如前第2个参数是sql语句,跟sqlite3_exec里的sql是一样的。是一个很普通的以0结尾的char*字符串。第3个参数是查询结果,它依然一维数组(不要以为是二维数组,更不要以为是三维数组)。它内存布局是:第一行是字段名称,后面是紧接着是每个字段的值。第4个参数是查询出多少条记录(即查出多少行)。第5个参数是多少个字段(多少列)。第6个参数是错误信息,跟前面一样,这里不多说了。,SQLite的API接口,3不使用回调查询数据库,SQL语句操作API:,result=sqlite3_get_table(db,“select*fromMyTable_1”,voidmainform:myslots()sqlite3*db;char*zErrMsg=0;intrc=sqlite3_open(xrs.db,嵌入式数据库SQLite的移植,解压缩:tarzxvfsqlite-amalgamation-3.5.9.tar.gzC/root/sqlite/for_arm进入sqlite目录:cd/root/sqlite/for_arm/sqlite-amalgamation-3.5.9建立安装目录sqlite_install:mkdir/root/sqlite/for_arm/sqlite_install配置:./configure-host=arm-linux-prefix=/root/sqlite/for_arm/sqlite_install编译:make安装:makeinstall进入/root/for_arm/sqlite_install查看,可以发现有三个目录,分别是include、lib、bin。分别存放了编写sqlite数据库应用程序需要的头文件、应用程序编译和运行时均需要的库函数、可在arm-linux系统上运行的sqlite命令行程序。,SQLite的交叉编译:,嵌入式数据库SQLite的移植,编译源程序:arm-linux-gcc-I/root/sqlite/for_arm/sqlite_install/include/-L/root/sqlite/for_arm/sqlite_install/lib/-osqlite_testsqlite_test.c-lsqlite3,嵌入式SQLite应用程序的编译和运行:,动态库连接(两种方法):1.设置环

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论