为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

天津科技大学嵌入式操作系统第5章嵌入式数据库

2019-12-16 91页 ppt 391KB 14阅读

用户头像 个人认证

东北往事

暂无简介

举报
天津科技大学嵌入式操作系统第5章嵌入式数据库重点回顾 共享内存通信 获得一段共享内存区域:shmget函数的作用是在内存中获得一段共享内存区域。 映射共享内存:使用函数shmat,它的作用是将创建的共享内存映射到具体的进程空间去。 撤销映射:shmdt函数用来撤销映射。 多线程编程**第5章嵌入式数据库5.1嵌入式数据库概述//5.2SQLite数据库5.3mSQL数据库//5.4BerkeleyDB数据库//*5.1嵌入式数据库概述5.1.1嵌入式数据库简介5.1.2嵌入式数据库的特点及分类5.1.3嵌入式数据库的应用*5.1.1嵌入式数据库简介 嵌入式数据库将数据库...
天津科技大学嵌入式操作系统第5章嵌入式数据库
重点回顾 共享内存通信 获得一段共享内存区域:shmget函数的作用是在内存中获得一段共享内存区域。 映射共享内存:使用函数shmat,它的作用是将创建的共享内存映射到具体的进程空间去。 撤销映射:shmdt函数用来撤销映射。 多线程编程**第5章嵌入式数据库5.1嵌入式数据库概述//5.2SQLite数据库5.3mSQL数据库//5.4BerkeleyDB数据库//*5.1嵌入式数据库概述5.1.1嵌入式数据库简介5.1.2嵌入式数据库的特点及分类5.1.3嵌入式数据库的应用*5.1.1嵌入式数据库简介 嵌入式数据库将数据库系统与操作系统和具体应用集成在一起,运行在各种智能嵌入式设备上。 与传统的数据库系统相比,它一般体积较小,有较强的便携性和易用性,以及较为完备的功能来实现用户对数据的管理操作。 但是,由于嵌入式系统的资源限制,它无法作为一个完整的数据库来提供大容量的数据管理,而且嵌入式设备可随处放置,受环境影响较大,数据可靠性较低。*5.1.1嵌入式数据库简介 在实际应用中,为了弥补嵌入式数据库存储容量小、可靠性低的不足,通常在PC机上配置后台数据库来实现大容量数据的存储和管理。 嵌入式数据库作为前端设备,需要一个GUI交互界面来实现嵌入式终端上的人机交互,并通过串口实现和PC机上主数据源之间的数据交换,实现系统服务器端数据的管理,接收嵌入式终端上传的数据和下载数据到嵌入式终端机等操作。 嵌入式数据库的名称来自其独特的运行模式。这种数据库嵌入到了应用程序进程中,消除了与客户机服务器配置相关的开销。* 嵌入式数据库实际上是轻量级的,在运行时,它们需要较少的内存。 它们是使用精简代码编写的,对于嵌入式设备,其速度更快,效果更理想。 嵌入式运行模式允许嵌入式数据库通过SQL来轻松管理应用程序数据,而不依靠原始的文本文件。 嵌入式数据库还提供零配置运行模式,这样可以启用其中一个并运行一个快照。5.1.1嵌入式数据库简介* 在嵌入式系统中,对数据库的操作具有定时限制的特性,这里把应用于嵌入式系统的数据库系统称为嵌入式数据库系统或嵌入式实时数据库系统(ERTDBS)。 嵌入式数据库是嵌入式系统的重要组成部分,也成为对越来越多的个性化应用开发和管理而采用的一种必不可少的有效手段。5.1.1嵌入式数据库简介* 在嵌入式数据库领域,各大数据库厂商竞争也日趋激烈,Oracle、IBM、Sybase、InterSystems、日立、Firefbird等均在这一领域有所行动。 如继2005年并购全球最大的内存数据库厂商TimesTen之后,去年,Oracle又收购了全球下载用户最多的嵌入式数据库厂商Sleepycat及其BerkeleyDB产品,进一步完善了嵌入式软件的产品线。 从Oracle自身来说,Oracle提供的不仅是一个嵌入式数据库产品,更重要的是从底层提供的一种端到端的数据管理架构,并大力支持重点行业领域的关键合作伙伴在此架构上开发的相关应用和服务。5.1.1嵌入式数据库简介* 嵌入式数据库会跟随信息技术以及互联网的发展得到普及,嵌入式数据库将成为工业智能化的必经之路,未来嵌入式数据库将有很大的发展空间。 首先,专业化发展明显。 其次,嵌入式数据库将朝化发展。 最后,嵌入式数据库与企业内部信息的同步管理将得到发展。5.1.1嵌入式数据库简介*5.1.2嵌入式数据库的特点及分类1.嵌入式数据库的特点2.嵌入式数据库的分类*1.嵌入式数据库的特点 嵌入性是嵌入式数据库的基本特性。 嵌入式数据库不仅可以嵌入到其他的软件当中,也可以嵌入到硬件设备当中。 例如嵌入式数据库Empress就是使数据库以组件的形式存在,并发布给客户,客户只需要像调用自己定义的函数那样调用相应的函数就可以创建表、插入删除数据等常规的数据库操作。 客户在自己的产品发布时,可以将Empress数据库编译到自己的产品内,变成自己产品的一部分,最终用户是感受不到数据库的存在的,也不用特意去维护数据库。* 可靠性要求是毋庸置疑的。 嵌入式系统必须能够在没有人工干预的情况下,长时间不间断地运行。 同时要求数据库操作具备可预知性,而且系统的大小和性能也都必须是可预知的,这样才能保证系统的性能。 嵌入式系统中会不可避免地与底层硬件打交道,因此在数据管理时,也要有底层控制的能力,如什么时候会发生磁盘操作,磁盘操作的次数,如何控制等。底层控制的能力是决定数据库管理操作的关键。1.嵌入式数据库的特点* 实时性和嵌入性是分不开的。 只有具有了嵌入性的数据库才能够第一时间得到系统的资源,对系统的请求在第一时间内做出响应。但是,并不是具有嵌入性就一定具有实时性。要想嵌入式数据库具有很好的实时性,必须做很多额外的工作。 比如:Empress实时数据库将嵌入性和高速的数据引擎、定时功能以及防断片处理等措施整合在一起来保证最基本的实时性。 当然,不同的场合实时性要求比较高时,除了软件的实时性外,硬件的实时性也是必须的,具体情况需要有具体和切实的解决,不能一概而论。1.嵌入式数据库的特点* 移动性是目前在国内提的比较多的一个说法,这和目前国内移动设备的大规模应用有关。 可以这么说,具有嵌入性的数据库一定具有比较好的移动性,但是具有比较好的移动性的数据库,不一定具有嵌入性。 比如,一个小型的C/S结构的数据库也可以运用在移动设备上,而具有移动性。但这个数据库本身是一个独立存在的实体,需要额外的运行资源,本质上讲和企业级数据库区别不大。 所以不具有嵌入性,也基本上不具备实时性。Empress是优秀的嵌入式实时数据库,毫无疑问也是非常优秀的移动数据库。1.嵌入式数据库的特点* 可定制性在嵌入式场合显得尤为重要。 首先嵌入式场合硬件和软件的平台都是千差万别,基本都是客户根据需要自己选择的结果。所以嵌入式场合的数据库必须能够支持非常多的平台,如Empress目前支持6000多种平台。 同时,数据存储要支持常见的存储设备,如CF/Flash/HD等。 多进程和多线程是必备的,现在的嵌入式系统已经远远不是当初的简单的编程,代码量增大,功能日益复杂,所以必然要支持多线程和多进程。 C/C++和SQL接口的支持也是必备的,作为数据库当然要有大家熟悉的SQL,但同时不要忘记嵌入式场合用的最多的标准的C/C++接口。1.嵌入式数据库的特点*2.嵌入式数据库的分类 可以按照嵌入的对象不同分为:软件嵌入数据库、设备嵌入数据库、内存数据库。 也有人将它们粗略的分为:嵌入数据库、移动数据库、小型的C/S结构数据库等。 小型C/S数据库。这种数据库其实是企业级数据库的一个缩小版,缩小以后可以在一些实时性要求不高的设备内运行。它只和操作系统有关,一般只能支持一些常见的移动操作系统,如,Linux和WindowsCE系列。* 面向软件嵌入数据库。它将数据库作为组件嵌入到其他的软件系统中。一般用在对数据库的安全性、稳定性和速度要求比较高的系统中。这种结构资源消耗低,最终用户不用维护数据库,甚至感受不到数据的存在。 面向设备嵌入数据库。它将关系型数据库嵌入到设备当中去,作为设备数据处理的核心组件。这种场合要求数据库有很高的实时性和稳定性,一般运行在实时性非常高的操作系统当中。为了达到这些要求有的厂商采用关系型的数据结构,有的采用非关系型的数据结构。有时候甚至直接和硬件打交道。当然,这种结构在实时性要求不高的移动场合更能够胜任。 内存数据库。数据库直接在内存内运行,数据处理更加高速,不过安全性等方面需要额外的手段来保障。2.嵌入式数据库的分类*5.1.3嵌入式数据库的应用1.医疗领域 北美和欧洲的一些著名的厂商利用嵌入式数据库开发过完整的电子病历系统,同时将数据库嵌入到医疗器械当中。如,血液分析装置、乳癌的装置、医学图像装置等。2.军事设备和系统 一些著名的军事机构和全球著名的武器生产商将嵌入式数据库运用到他们的系统控制装置、战士武器、军舰装置、火箭和导弹装置中。这些场合用的数据库有很多的安全设定和特化设定,基本上严格按照每个客户的技术标准的要求来特化引擎级构件。具体的应用级的构件由客户自己完成。*3.地理信息系统 地理信息包括的范围很广,在国外地理信息系统已经发展了很多年,国内这几年也逐渐加大对地理信息系统方面的投入。嵌入式数据库在地理信息系统方面的应用非常广泛。如,空间数据分析系统、卫星天气数据、龙卷风和飓风监控及预测等等。几乎涉及到地理信息的方方面面。4.工业控制 工业控制的一个基本方式是一个反馈的闭环或半闭环的控制方式。随着工业控制技术的发展,简单的数据采集方式和反馈方式基本上很难满足要求。采用嵌入式数据库即能够进行高速的数据采集,也能够快速的反馈。5.1.3嵌入式数据库的应用*5.网络通讯 随着互联网的发展,网络越来越普及,网络设备的处理能力越来越强、各种要求也越来越高,运用嵌入式数据库也成了必然趋势。我们现在日常见到的很多网络设备和系统都已经使用了嵌入式数据库。6.空间探索 一些全球著名的机构将嵌入式数据库用在一些著名的空间探索装置中,如大家熟知的一些太阳系内行星的探测器等。5.1.3嵌入式数据库的应用*7.消费类电子 目前在中国消费类电子比较火热,它包含的范围也非常广。如:个人消费相关的PND、移动电话、PDA、SmartPhone、数码产品等;信息家电和智能办公相关的机顶盒、家用多媒体盒、互联网电视接收装置、打印机、一体机等;还有汽车电子等。5.1.3嵌入式数据库的应用*5.2SQLite数据库5.2.1SQLite数据库概述5.2.2SQLite数据库的安装5.2.3SQLite数据库基本命令5.2.4SQLite数据库管理命令5.2.5SQLite的API函数5.2.6SQLite实例分析*5.2.1SQLite数据库概述1.概述2.SQLite组件3.数据类型*1.概述 SQLite是D.RichardHipp用C语言编写的开源嵌入式数据库引擎。发布于2000年5月。它是完全独立的,不具有外部依赖性。 SQLite支持多数SQL92标准,可以在所有主要的操作系统上运行。 其创建者保守地估计SQLite可以处理每天负担多达100,00次点击率的Web站点,并且SQLite有时候可以处理10倍于上述数字的负载。5.2.1SQLite数据库概述* SQLite对SQL92标准的支持包括索引、限制、触发和查看。SQLite不支持外键限制,但支持原子的、一致的、独立和持久(ACID)的事务(后面会提供有关ACID的更多信息)。 SQLite通过数据库级上的独占性和共享锁定来实现独立事务处理。 这意味着当多个进程和线程可以在同一时间从同一数据库读取数据,但只有一个可以写入数据。 在某个进程或线程向数据库执行写入操作之前,必须获得独占锁定。 在发出独占锁定后,其他的读或写操作将不会再发生。5.2.1SQLite数据库概述*2.SQLite组件 SQLite由以下几个组件组成:SQL编译器、内核、后端以及附件 SQLite通过利用虚拟机和虚拟数据库引擎(VDBE),使调试、修改和扩展SQLite的内核变得更加方便。 所有SQL语句都被编译成易读的、可以在SQLite虚拟机中执行的程序集。5.2.1SQLite数据库概述*5.2.1SQLite数据库概述3.数据类型 SQLite不支持静态数据类型,而是使用列关系。这意味着它的数据类型不具有表列属性,而具有数据本身的属性。 当某个值插入数据库时,SQLite将检查它的类型。如果该类型与关联的列不匹配,则SQLite会尝试将该值转换成列类型。 如果不能转换,则该值将作为其本身具有的类型存储。 SQLite支持NULL、INTEGER、REAL、TEXT和BLOB数据类型。*5.2.2SQLite数据库的安装 sqlite是一个面向嵌入式系统的数据库,编译完成只有200K,同时支持2T的数据记录。对于嵌入式设备是一个很好的数据库引擎。SQLite是源码开放,可以直接到网上免费下载源码包,其下载地址为:http://www.sqlite.org/download.html。这里我们下载到了3.7.15.2这个版本,我们使用的操作系统是ubuntu10,依照Readme中的步骤,其安装过程如下:1.本地安装 把下载到的压缩包拷贝到root目录下,然后运行解压压缩包命令,在当前目录会生成一个sqlite-autoconf-3071502的子目录,所有的源代码都存放到了该目录中,进入到该目录进行配置,配置完后会在当前目录下生成Makefile文件。* 接下来编译并安装,其命令如下: 使用GNU的AUTOCONF和AUTOMAKE产生的程序的安装步骤如下:[root@JLUZH~]#tar-zxvfsqlite-autoconf-3071502.tar.gz[root@JLUZH~]#cdsqlite-autoconf-30715025.2.2SQLite数据库的安装【常用参数】:tar常用参数如下:-x解开一个打包文件的参数指令-f指定打包后的文件名,注意:在f之后不能有其他参数-z调用gzip来压缩或解压打包文件-v执行时显示详细的信息* ./configure是用来检测你的安装平台的目标特征的。比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本 make是用来编译的,它从Makefile中读取指令,然后编译。 makeinstall是用来安装的,它也从Makefile中读取指令,安装到指定的位置。[root@JLUZH~/sqlite-autoconf-3071502]#./configure[root@JLUZH~/sqlite-autoconf-3071502]#make[root@JLUZH~/sqlite-autoconf-3071502]#makeinstall5.2.2SQLite数据库的安装*在make和makeinstall之后,库文件编译并安装在/usr/local/lib目录下,可执行文件sqlite3安装在/usr/local/bin目录下,头文件安装在/usr/local/include目录下。在链接程序时,为了能够找到库文件,需要把库文件所在路径加到系统文件/etc/ld.so.conf中,如图在文件后面追加/usr/local/lib一行内容。保存文件并退出,重新启动系统之后,设置生效,如果不想重新启动系统,可运行如下命令:[root@JLUZH~]#/sbin/ldconfig5.2.2SQLite数据库的安装* 为了验证安装是否成功,在shell下运行sqlite3命令创建一个数据库,并测试数据库,其命令如下:[root@JLUZHbin]#sqlite3SQLiteversion3.6.20Enter".help"forinstructionsEnterSQLstatementsterminatedwitha";"sqlite>5.2.2SQLite数据库的安装*2.交叉编译与安装 如果要把SQLite3运行在嵌入式体系上,则需要对SQLite3进行交叉编译。以编译在ARM体系运行的SQLite3为例,基本操作步骤和前面一致,只是更改了配置信息。 --disabel-tcl参数表示屏蔽掉tcl库;-prefix参数指定安装的路径,在这里/usr/local为指定的安装bin、lib、include路径; --host参数指定交叉编译器。这里armv4l-unknown-linux为交叉编译器。需要指出的是,该交叉编译器需要提前安装好,并且交叉编译器的路径已经加入到环境变量中。配置完后,编译安装的步骤和本地安装一致。[root@JLUZHsqlite-3.6.20]#./configure–disable–tcl–host=armv4l-unknown-linux–prefix=/usr/local5.2.2SQLite数据库的安装*5.2.3SQLite数据库基本命令 便于学习,我们结合实例来说明命令的使用,假设我们要一个个人信息管理系统。 首先我们根据需求来设计一个数据库,命名为test.db,在个人信息管理系统中我们主要是要实现对某个人的信息进行增加、删除、修改、查询等操作,而个人信息主要包括姓名、性别和电话,我们创建一个people的数据表,这样就可以起到一个通讯录的作用,用户也可以根据别的需求增加其他字段。 另外,在数据库的表中应该有一个主键,由于名字可能发生重名,所以不能作为主键,所以我们将增加ID字段来作为主键。*people数据表的结构如表5-1所示。5.2.3SQLite数据库基本命令* 用sqlite3建立数据库的方法很简单,启动终端,只需输入如下命令:[root@JLUZHsqlite-3.6.20]#sqlite3test.dbSQLiteversion3.6.20Enter".help"forinstructionsEnterSQLstatementsterminatedwitha";"(1)建立数据库* createtable指令的语法为: createtabletable_name(field1,field2,field3,...); table_name是数据表的名称,fieldx则是字段的名字。sqlite3与许多SQL数据库软件不同的是,它不在乎字段属于哪一种数据型态,sqlite3的字段可以储存任何类型:文字、数字、大量文字(blub),它会在适时自动转换。 假设我们要建一个名叫people的数据表,只要键入以下指令就可以了: CREATETABLEpeople(IDintegerprimarykey,namevarchar(10),ageinteger,numvarchar(18)); 执行以上命令建立了一个名叫people的数据表,里面有ID、name、age、num四个字段。(2)建立表* 如果数据表有相当多的数据,我们便会建立索引来加快速度。这个指令的语法为: createindexindex_nameontable_name(field_to_be_indexed); 针对上面的数据表people建立一个索引,则可以使用如下命令: createindexpeople_name_indexonpeople(name); 意思是针对people数据表的name字段,建立一个名叫people_name_index的索引。一旦建立了索引,sqlite3会在针对该字段作查询时,自动使用该索引。这一切的操作都是在幕后自动发生的,无须使用者特别指令。(3)建立索引* 接下来我们要加入记录了,加入的方法为使用insertinto指令,语法为: insertintotable_namevalues(data1,data2,data3,...); 例如在people数据表中,我们使用如下命令加入记录: insertintopeopleVALUES(1,'LiMing',20,'362302198901010214'); insertintopeopleVALUES(2,'LiSi',21,'362302199005010254'); insertintopeopleVALUES(3,'WangWu',20,'362302198905050954');(4)插入记录*(5)查询记录 查询记录的命令为select,其基本格式如下: selectcolumnsfromtable_namewhereexpression; 以下是select命令的一些例子: select*frompeople;当然是列出所有数据库的内容 select*frompeoplewherename='LiSi';查找姓名为LiSi的记录 select指令是SQL中最强大的指令,这里只是简单介绍select的基本用法,进一步的各种组合,请大家参考有关数据库的书籍*(6)修改或删除记录 掌握select语句的用法非常重要,因为要在sqlite中更改或删除记录,其语法是类似的。修改记录的命令为update,删除记录的命令为delete,其使用如下: updatepeoplesetname='Lisi'wherename='LiSi';修改姓名为LiSi的记录 deletefrompeoplewherename='Lisi';删除姓名为Lisi的记录*5.2.4SQLite数据库管理命令 在终端输入sqlite3命令启动数据库系统后,就会出现sqlite->提示符,在提示符下输入命令即可操作SQLite3数据库,数据库的管理可以使用命令行方式,也可以使用图形化方式进行管理。1.命令行方式管理命令 (1)Help命令 启动sqlite数据管理系统后,出现提示符sqlite->,则可以输入数据库管理命令了,注意命令之前必须用“.”开头,比如help命令的执行如下:*sqlite>.help.backup?DB?FILEBackupDB(default"main")toFILE.bailON|OFFStopafterhittinganerror.DefaultOFF.databasesListnamesandfilesofattacheddatabases.dump?TABLE?...DumpthedatabaseinanSQLtextformatIfTABLEspecified,onlydumptablesmatchingLIKEpatternTABLE.…(1)Help命令* Database命令用于查看当前的数据库,其命令格式如下:sqlite>.databaseseqnamefile--------------------------------------------------------------0main/root/sqlite/test.db1temp输入.database命令后,即可按顺序显示当前的数据库,并且显示对应数据库的文件,这里是/root/sqlite/test.db文件。(2)Database命令* Tables命令用于查看当前数据库中有多少个数据表,其命令格式如下: qlite>.tables people 输入.tables命令后,可以看出,在这个数据库中存在一个people的数据表。(3)Tables命令* Schema命令用于查看数据表的结构,其命令格式如下: sqlite>.schemapeople CREATETABLEpeople(IDintegerprimarykey,namevarchar(10),ageinteger,numvarchar(18)); 输入.schemapeople命令后,即可显示people数据表的结构。(4)Schema命令* Output命令用于把查询的结果输出到文件,其使用格式如下:sqlite>.outputwen.txtsqlite>select*frompeople;sqlite>.exit退出后,即可在当前目录下找到wen.txt文件,然后使用cat命令显示其内容,其操作如下:[root@JLUZHsqlite]#catwen.txt1|LiMing|20|3623021989010102142|LiSi|21|3623021990050102543|WangWu|20|362302198905050954(5)Output命令* 使用.dump命令可以输出表结构,同时输出操作记录。这样可以创建一个包含必要命令和数据的文件,从而重新创建数据库。.dump命令也可以用于备份数据库表,其操作格式如下。sqlite>.dumpPRAGMAforeign_keys=OFF;BEGINTRANSACTION;CREATETABLEpeople(IDintegerprimarykey,namevarchar(10),ageinteger,numvarchar(18));INSERTINTO"people"VALUES(1,'LiMing',20,'362302198901010214');INSERTINTO"people"VALUES(2,'LiSi',21,'362302199005010254');INSERTINTO"people"VALUES(3,'WangWu',20,'362302198905050954');COMMIT;(6)Dump命令*(7)quit/exit 这两个命令用于退出sqlite数据库系统,其操作如下:sqlite>.quit[root@JLUZHsqlite]#* 管理SQLite数据库除命令行外,网络上还有很多开源的可视化的SQLite数据库管理工具,登陆https://sourceforge.net/或者通过其他搜索引擎(GOOOGLE/BAIDU),输入“SQLite”可以找到一大片相关工具,比如,SQLite Database Browser、SQLite Administrator... 等等。 这里推荐SQLite Administrator工具,该工具界面支持简体中文、界面比较简洁、数据库相关管理操作相对比较简便,该工具可以登陆http://sqliteadmin.orbmu2k.de/下载,其操作界面如图5-3所示2.图形化管理工具*2.图形化管理工具*重点回顾 嵌入式数据库简介 SQLite数据库 SQLite数据库基本命令:建立数据库、建立表、建立索引、插入记录、查询记录、修改和删除记录 SQLite数据库管理命令:Help、Database、Tables、Schema、Output、Dump、quit/exit*5.2.5SQLite的API函数1.打开数据库 打开数据库的函数格式如下: intsqlite3_open( constchar*filename,/*数据库名称*/ sqlite3**ppDb/*输出参数,SQLite数据库句柄*/); 该函数用来打开或创建一个SQLite3数据库。如果在包含该函数的文件所在的路径下有同名的数据库(*.db),则打开数据库,如果不存在数据库,则创建一个同名的数据库在该路径下。如果打开或创建数据库成功,则该函数返回0,输出参数为sqlite3类型的变量,后续对该数据库的操作,通过该参数进行传递。* 关闭数据库的函数格式如下: intsqlite3_close(sqlite3*db); 当结束对数据库的操作时,调用该函数来实现关闭数据库,该函数的一个参数是成功打开数据库时的输出参数----sqlite3类型的变量。2.关闭数据库* intsqlite3_exec( sqlite3*,/*打开的数据库名称*/ constchar*sql,/*要执行的SQL语句*/ sqlite_callback,/*回调函数*/ void*,/*回调函数的参数*/ char**errmsg/*错误信息*/ ); 实现对数据库操作时,可以通过调用该函数来完成,sql参数为具体操作数据库的SQL语句。在执行过程中,如果出现错误,相应错误信息可以存放在errmsg变量中。3.执行函数* 释放内存函数的格式如下: voidsqlite3_free(char*z); 在对数据库操作时,如果需要释放在中间过程中保存在内存的数据,可以通过该函数来清除内存空间。4.释放内存函数* 显示错误信息函数的格式如下: constchar*sqlite3_errmsg(sqlite3*) 通过API函数实现对数据库操作的过程中,出现的错误信息可以通过该函数给出。5.显示错误信息* 获取结果集函数的格式如下: intsqlite3_get_table( sqlite3*,/*打开的数据库名称*/ constchar*sql,/*要执行的SQL语句*/ char***resultp,/*结果集*/ int*nrow,/*结果集的行数*/ int*ncolumn,/*结果集的列数*/ char**errmsg/*错误信息*/ ); 对数据库进行查询操作时,可以通过该函数来获取结果集。该函数的入口参数为查询的SQL语句,出口参数有二维数据指针,指示查询结果的内容,还有结果集的行数和列数,这里面的行数为纯记录的条数,但是resultp数组里包含一行字段名的值。6.获取结果集* 释放结果集函数格式如下: intsqlite3_free_table(char**result); 释放sqlite3_get_table()函数所分配的内存空间。7.释放结果集* 声明SQL语句的函数格式如下: intsqlite3_prepare(sqlite3*,constchar*,int,sqlite3_stmt**,constchar**); 该接口把一条SQL语句编译成字节码留给后面的执行函数,使用该接口访问数据库是当前比较好的一种方法。8.声明SQL语句* 销毁一个准备好的SQL声明的函数格式如下: intsqlite3_finalize(sqlite3_stmt*); 该函数将销毁一个准备好的SQL声明,在数据库关闭之前,所有准备好的声明都必须被释放销毁。9.销毁SQL声明* 重置SQL声明的函数格式如下: intsqlite3_reset(sqlite3_stmt*); 函数用来重置一个SQL声明的状态,使得它可以被再次执行。10.重置SQL声明*5.2.6SQLite实例分析 本节通过一个小例子说明如何在C与C++调用SqliteAPI完成数据库的创建、插入数据与查询数据。 本节用的数据库为上节建立的test.db,本文的开发环境为ubuntu,程序的代码如下:*5.2.6SQLite实例分析#include<stdio.h> /***sqlite.c*5-2-6**/#include<sqlite3.h>intmain(){ sqlite3*db=NULL; intrc;introw,col; char*Errormsg; char**Result; inti=0,j=0; rc=sqlite3_open("test.db",&db)* if(rc){fprintf(stderr,"cant,topen:%s\n",sqlite3_errmsg(db)); sqlite3_close(db); return1; } elseprintf("opensuccessly!\n"); char*sql="createtablepeople(IDintegerprimarykey,namevarchar(10),ageinteger,numvarchar(18))"; sqlite3_exec(db,sql,0,0,&Errormsg);5.2.6SQLite实例分析* sql="insertintopeoplevalues(1,'LiMing',20,'362302198901010214')"; sqlite3_exec(db,sql,0,0,&Errormsg); sql="insertintopeoplevalues(2,'LiSi',21,'362302199005010254')"; sqlite3_exec(db,sql,0,0,&Errormsg); sql="insertintopeoplevalues(3,'WanWu',20,'362302198905050954')"; sqlite3_exec(db,sql,0,0,&Errormsg); sql="select*frompeople";5.2.6SQLite实例分析* sqlite3_get_table(db,sql,&Result,&row,&col,&Errormsg);printf("row=%dcolumn=%d\n\n",row,col); for(i=0;i<row+1;i++) { for(j=0;j<col;j++)printf("%s\t",Result[j+i*col]); printf("\n"); } sqlite3_free(Errormsg); sqlite3_free_table(Result); sqlite3_close(db); return0;}5.2.6SQLite实例分析* 程序的编译运行过程如下:[root@JLUZHsqlite]#gcc–osqlitesqlite.c-lsqlite3[root@JLUZHsqlite]#./sqliteopensuccessly!row=3column=4ID name age num 1 LiMing 20 3623021989010102142 LiSi 21 362302199005010254 3 WangWu 20 362302198905050954[root@JLUZHsqlite]#5.2.6SQLite实例分析当安装路径不是usr时,需要添加库和头文件的搜索路径。gcc-osqlite-L/home/wjh/sqlite-autoconf-3071502/lib-I/home/wjh/sqlite-autoconf-3071502/includesqlite.c-lsqlite3-l选项,它指示gcc去连接库文件sqlite3.so。Linux下的库文件在命名时有一个约定,那就是应该以lib三个字母开头。由于所有的库文件都遵循了同样的,因此在用-l选项指定链接的库文件名时可以省去lib三个字母。也就是说gcc在对-lsqlite3进行处理时,会自动去链接名为libsqlite3.so的文件。* 在确定是否在应用程序中使用SQLite之前,应该考虑以下几种情况: 目前没有可用于SQLite的网络服务器。从应用程序运行位于其他计算机上的SQLite的惟一方法是从网络共享运行。这样会导致一些问题,像UNIX®和Windows®网络共享都存在文件锁定问题。还有由于与访问网络共享相关的延迟而带来的性能下降问题。 SQLite只提供数据库级的锁定。虽然有一些增加并发的技巧,但是,如果应用程序需要的是表级别或行级别的锁定,那么DBMS能够更好地满足您的需求。5.2.6SQLite实例分析* 正如前面提到的,SQLite可以支持每天大约100,00次点击率的Web站点——并且,在某些情况下,可以处理10倍于此的通信量。对于具有高通信量或需要支持庞大浏览人数的Web站点来说,应该考虑使用DBMS。 SQLite没有用户帐户概念,而是根据文件系统确定所有数据库的权限。这会使强制执行存储配额发生困难,强制执行用户许可变得不可能。5.2.6SQLite实例分析* SQLite支持多数(但不是全部)的SQL92标准。不受支持的一些功能包括完全触发器支持和可写视图。 如果您感到其中的任何限制会影响您的应用程序,那么您应该考虑使用完善的DBMS。如果您可以解除这些限制问题,并且对快速灵活的嵌入式开源数据库引擎很感兴趣,则应重点考虑使用SQLite。 一些能够真正表现SQLite优越性能的领域是Web站点,可以使用SQLite管理应用程序数据、快速应用程序原型制造和培训工具。5.2.6SQLite实例分析*5.3mSQL数据库5.3.1mSQL简介5.3.2mSQL数据库的安装5.3.3mSQL的常用API函数5.3.4mSQL数据库的使用*5.3.1mSQL简介 mSQL(miniSQL)是一个单用户数据库管理系统,个人使用免费,商业使用收费。由于它的短小精悍,使其开发的应用系统特别受到互联网用户青睐。 mSQL(miniSQL)是一种小型的关系数据库,性能不是太好,对SQL语言的支持也不够完全,但在一些网络数据库应用中是足够了。 由于mSQL较简单,在运行简单的SQL语句时速度比MySQL略快,而MySQL在线程和索引上下了功夫,运行复杂的SQL语句时比mSQL,PostgreSQL等都要快一些。* 2005年5月8日发布的3.7.MSQL,其标志是一个鹿* mSQL的技术特点:安全性方面,mSQL通过ACL文件设定各主机上各用户的访问权限,缺省是全部可读/写。mSQL缺乏ANSISQL的大多数特征,它仅仅实现了一个最最少的API,没有事务和参考完整性。mSQL与Lite(一种类似C的脚本语言,与分发一起发行)紧密结合,可以得到一个称为W3-mSQL的一个网站集成包,它是JDBC、ODBC、Perl和PHPAPI。*5.3.2mSQL数据库的安装 目前,mSQL官方网站为:http://www.hughes.com.au/,它以两种形式发布,一种是以RPM软件包方式,另一种是用tar压缩的源代码方式。对于RPM软件包方式的软件包安装很简单,只用一条命令就可以完成:Rpm–ivhmsql-3.8.rpm。而对于以源代码方式发布的mSQL安装则要麻烦一些。可以采用如下步骤:[root@JLUZHmsql]#tar-xvfmsql-3.8.tar.gz[root@JLUZHmsql]#cdmsql-3.8[root@JLUZHmsql-3.8]#./setup[root@JLUZHmsql-3.8]#makeall[root@JLUZHmsql-3.8]#makeinstall* 安装完后还要修改配置文件,在实际应用中我们改动得最多的是mSQL-User和Admin-User这两个参数。mSQL-User指明运行mSQL数据库服务程序的用户,而Admin-User指明能对mSQL数据库系统执行特权操作(如:关闭数据库服务程序的运行,创建数据库等操作)的用户。因此,如果你希望mSQL服务程序以database这个用户运行,指定admin这个用户能执行数据库操作,你要将mSQL-User和Admin-User所在的行分别改为:mSQL-User=database和Admin-User=admin。另外你还必须将安装目录下的文件和目录的属主改为database。使用如下命令修改配置文件:[root@JLUZH~]#cd/usr/local/msql3/[root@JLUZHmsql3]#geditmsql.conf*msql.conf典型配置文件如下: #msql.conf-ConfigurationfileforMiniSQLVersion3 #----------------------------------------------------------------------- #Thisfileisanexampleconfigurationandmayrequiremodificationto #suityourneedsoryoursite.Thevaluesgivenarethedefaultvalues #andwillbeusedbythesoftwareifeitherthisfileismissingora #specificvalueisnotspecified. #----------------------------------------------------------------------- #NOTE:Theinstalldirectoryandallfiles/directoriesbelowit_must_ #beownedbytheuserspecifedinthemSQL_Userparameter(the #usermsqlbydefault).IfyouchangethemSQL_Uservaluethen #youmust'chown-R'theinstalldirectory. [general] Inst_Dir=/usr/local/msql3 DB_Dir=%I/msqldb mSQL_User=daemon Admin_User=root Pid_File=%I/msql3d.pid TCP_Port=1114* UNIX_Port=%I/msql3.sock [system] Num_Children=2 Msync_Timer=30 Host_Lookup=True Read_Only=False Remote_Access=False Local_Access=True Force_Munmap=False Query_Log=False Query_Log_File=%I/query.log #Update_Log=False #Update_Log_File=%I/update.log Table_Cache=8 Sort_Max_Mem=1000*5.3.3mSQL的常用API函数 对嵌入式系统而言,应用程序往往是通过调用SQL的API函数来执行对特定数据库的操作。API函数使得任何c语言程序都可以与mSQL的数据库引擎进行通信。常见的API函数如下:  msqlConnect()  用于建立与mSQL服务器的连接。 msqlQuery()      用于向mSQL服务器提交SQL操作命令。 msqlSelectDB() 对数据库进行查询等操作前,调用本函数将之选中。 msqlStoreResult()用于保存查询。 msqlClose()       关闭己打开的数据库,以释放系统资源。 msqlListDBs()     用于取当前己连接的mSQL服务器上的数据库列表。 msqlListlndex()   用于获得数据表索引。*5.3.4mSQL数据库的使用 为了将mSQL集成到用户的应用程序中去,mSQL数据库系统为用户提供了一个C语言的API库和一个解释器:w3—msql,通过C语言的API库,你可以将mSQL集成到用标准C语言开发的应用程序中去。而有了w3—msql这个工具,你可以通过编写类C语言脚本语言将mSQL数据库嵌入到html文件中,下面举一程序实例进行说明。* 采用C语言实现的方法如下所示: voidmain(intargc,charargv[]) { //解析用户提交上来的用户名和口令并保存到变量username和password—usr中 … sock=msqlConnect(NULL);//创建与本机的mSQL数据库系统的套接字 if(msqlSelectDB(sock,″test″)==-1)//选择数据库test { …//输出数据库选择失败信息 } else { sprintf(buff,″selectfromregistered—userwhereusername=′%s′″,username);//以username查询表registered—user中的记录 if(msqlQuery(sock,buff)==-1) { …//输出查询失败的错误信息 } res=msqlStoreResult();//将查询结果保存到m—result类型的指针变量res numrow=msqlNumRows(res);//得到查询结果的记录数 if(numrow==1)* { row=msqlFetchRow(res);//得到当前记录,类型为:m_row if(!strcmp(password_ur,row[2])) //将保存在表中的口令和用户输入的口令相比较 { …//输出注册成功信息 } else { …//输出口令不对的提示信息 } } else { …//输出用户名输入出错信息 } } msqlFreeResult(res);//释放查询结果的指针 msqlClose(sock);//关闭数据库系统的套接字 return; }*5.4BerkeleyDB数据库5.4.1BerkeleyDB简介5.4.2BerkeleyDB的安装*5.4.1BerkeleyDB简介 DBkeleyDB是一款健壮的、高速的工业级开放源代码的嵌入式数据库管理系统。应用它,程序员只需要调用一些简单的API就可以完成对数据的访问和管理。BerkeleyDB的源代码有C和Java两种,函数库本身只有300KB左右,但却能够用来管理多达256TB的数据。BerkeleyDB作为一种嵌入式数据库系统在许多方面有着独特的优势。首先,由于其应用程序和数据库管理系统运行在相同的进程空间当中,进行数据操作时可以避免繁琐的进程间通信,因此耗费在通信上的开销自然也就降低到了极低程度。其次,BerkeleyDB使用简单的函数调用接口来完成所有的数据库操作,而不是在数据库系统中经常用到的SQL语言,避免了对结构化查询语言进行解析和处理所需的开销。* DB支持几乎所有的现代操作系统,如LINUX、UNIX、WINDOWS等,也提供了丰富的应用程序接口,支持C、C++、JAVA、PERL、TCL、PYTHON、PHP等。DB的应用十分广泛,在很多知名的软件中都能看到其身影。例如,利用DB在LINUX下实现内核级文件系统。LINUX下的软件包管理器RPM也使用DB管理软件包相关数据。 值得注意的是DB是嵌入式数据库系统,而不是常见的关系/对象型数据库,对SQL语言不支持,也不提供数据库常见的高级功能,如存储过程,触发器等。* BerkeleyDB是历史悠久的嵌入式数据库系统,其设计思想是简单、小巧、可靠、高性能。如果说一些主流数据库系统是大而全的话,那么DB就可称为小而精。DB提供了一系列应用程序接口(API),调用本身很简单,应用程序和DB所提供的库在一起编译成为可执行程序。这种方式从两方面极大提高了DB的效率。第一:DB库和应用程序运行在同一个地址空间,没有客户端程序和数据库服务器之间昂贵的网络通讯开销,也没有本地主机进程之间的通讯;第二:不需要对SQL代码解码,对数据的访问直截了当。 DB对需要管理的数据看法很简单,DB数据库包含若干条记录,每一个记录由关键字和数据(KEY/VALUE)构成。数据可以是简单的数据类型,也可以是复杂的数据类型,例如C语言中结构。DB对数据类型不做任何解释,完全由程序员自行处理,典型的C语言指针的"自由"风格。如果把记录看成一个有n个字段的表,那么第1个字段为表的主键,第2-n个字段对应了其它数据。DB应用程序通常使用多个DB数据库,从某种意义上看,也就是关系数据库中的多个表。DB库非常紧凑,不超过500K,但可以管理大至256T的数据量。* 数据库句柄结构DB:包
/
本文档为【天津科技大学嵌入式操作系统第5章嵌入式数据库】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索