![]() |
||||||
检验仪器中的SQLite数据库编程 |
| 本文说明相关:lSSN1009—3044ComputerKnowledgeandTechnology电脑知识与技术V01.6,No.8,March2010,PP.1797—1799检验仪器中的SQLite数据库编程杜慧江(上海医疗器械高等专科学校,上海200093)E-mail:jsh@ceee.net.crlhttp://www.dnzs.net.cnTel:+86-551-56 |
| lSSN1009—3044ComputerKnowledgeandTechnology电脑知识与技术V01.6,No.8,March2010,PP.1797—1799检验仪器中的SQLite数据库编程杜慧江(上海医疗器械高等专科学校,上海200093)E-mail:jsh@ceee.net.crlhttp://www.dnzs.net.cnTel:+86-551-56909635690964摘要:SQLite是开放源码的基于文件系统的嵌入式关系数据库,具有体积小、快速高效、稳定可靠、夸平台等特点,非常适用于嵌入式环境下的数据管理。该文结合具体实例,介绍了将SQLite应用于医用检验分析仪器开发。在ax'/n嵌入式Linux及QTEmbeded环境下的编程方法。关键词:嵌入式数据库:SQLite:检验仪器中图分类号:TP311文献标识码:A文章编号:1009—3044(2010)08—1797-03SQLiteProgramminginLaboratoryAnalyzerDUH11i-jiang(shan咖aiMedicalImtrumentatinnCollege,Shan曲ai200093,China)Abstract:SQLiteisanopenSOUrCeembeddedrelationdatabaseengine.Ithassmallsize,highperformance,robustnessandportabilityfea-mres.Indaispaper,SQLiteWasapphedtodevelopinghboratoryanalyzer.ThedevelopingmethodinARMembeddedClinuxandQTplatformisintroducedandadetailedexampleisgivenforpresentation.Keywords:embeddeddatabase;SQLite;laboratoryanalyzer随着嵌入式技术的广泛应用,医学检验仪器在不断向小型化、智能化方向发展,功能越来越多,数据量也越来越大。有些检验仪器以前不需要保存历史数据,现在更新换代的需求要求保存一定数最的历史数据;特别是功能复杂的精密仪器,在开发过程中,各种部件的指令、动作大量增加。这些仪器都迫切需要适合嵌入式平台的数据库技术作为支撑.完成开发工作。l嵌入式关系数据库SQLiteSQLite是一个小型嵌入式关系数据库,它是完全独立的,非常容易被应用于嵌入式系统中。 其源代码公开,可以免费用于包括商业目的的任何用途:目前已经更新到3.6.17版本。虽然是非常轻量级的数据库系统,SQLite却支持绝大多数SQL92标准,支持多表和索引、事务、视图、触发,以及一系列的用户接口、驱动。其主要特征如下【1】:1)支持原子的、独立的和持久的事务特性,即使系统崩溃和掉电;2)零配置。无需安装和管理;3)一个完整的数据库存储在单一的磁盘文件中;4)数据库文件可以在不同字节顺序的机器间自由共享;5)支持数据库大小至2TB;6)字符串和二进制大对象(BLOB)的大小仅被有效内存限制;7)源代码体积小,编译后不超过300k;8)操作速度快:9)API简单易用。2SQLite内部结构和开发技术2.1SQLite内部结构SQLite采用模块化设计,主要由4个部分构成:内核(Core)、SQL编译器(SQLCompiler)、后端(Baekend),以及附件(Acces—sories)oSQLite的接口是一些已经编写好的c库。可以使用各种语言调用。SQL语句通过接口进入SQL编译器,由标记处理器分解成可以识别的各种标识符。然后由分析器重新组合标识符并调用代码生成器,生成虚拟机器码,交由虚拟机执行,最终完成SQL语句指定的任务。虚拟机是SQLite内部结构的核心。不仅完成与数据相关的全部操作,而且还是客户和存储之间信息交换的中间单元。 数据库以B树(B—Tree)的形式存储在磁盘上,通过可调整的页面缓冲获得对数据的快速查找和存储。为了方便移植,SQLite使用一个抽象层接口与不同操作系统进行对接。2.2SQLite开发技术以SQLite3.5.9版本C语言的API接口闭为例:收稿日期:2010—01—16作者简介:杜慧江(1975-),男,山西阳泉人,讲师,硕士,主要研究方向为数据库、嵌入式系统。本栏目责任编辑:闻翔军一-一一·一一·数量库与信息蕾曩··1797ComputerKnowledgeandTechnology电蓝知识与技术第6卷第8期(2010年3月)1)打开数据库intsqlite3_open_v2(constchar*filename,严数据库文件名(IJTF一8)4,sqlite3料ppDb,产输出:SQLite数据库句柄木/intflags。 严互斥标志}/constchar*zVfsp使用的VFS模块名称木/);在新版SQLite中建议使用sqlite3_open_v2替代旧的sqlite3_open,但是为了兼容113的应用,依然保留了sqlite3open(以下其他函数类似osqlite3_open_.v2函数的第一个参数为要打开的数据库文件名;第二个参数为返回的数据库句柄:第三个参数是互斥标志.通常为SQLITEOPEN_READONLY、SQLITE_OPEN_READWRITE和SQLITE_OPEN_READWRITEISQLITE_CIPEN_CREATE这三个值与SQLITE_OPEN—NOMUTEX或者SQLIrrE—OPEN_FULLMUTEX这两个值的组合。第四个参数是要使用的VFS模块名称,如果使用当前系统默认的文件系统,可以使用NULL。 2)关闭数据库intsqlite3_close(sqlite34);参数就是打开时返回的SQLite数据库句柄。3)执行SQL语句sqlite3_exec0函数是为了使用方便而设的。如果在需要高效或者重复大量执行SQL语句,就应该使用sqlite3_prepare0、sqlite3_step0、sqlite3_column0和sqlite3_finalize0等函数。SQL语句在执行之前,必须被编译成字节码送到虚拟机执行.sqlite3_pre-pare_v20就是完成这个工作:intsqlite3_preparev2(sqlite3*db./宰数据库句柄木/eonstchar+zSql,严SQL语句(UTF-8)+,intnByte,pSQL语句最大字节数+,sqlite3一strut**ppStmt,/木输出数据集。,constchar料pzTailpSQL语句中未用的部分·,);sqlite3一step(sqlite3_stmt4)用来执行已经过prepare的SQL语句。如果执行的是查询语句,则返回SQLITE—ROW表明得到了一行数据;再次执行sqlite3一step0,返回查询结果的下一行。如果执行的不是查询语句,则返回SQLITE_DONE或者SQLITE—ERROR。sqlite3_column0函数负责从查询结果数据集中取出当前行某一列的值。实际上它包括了一组对应不同数据类型的函数:sqlite3_column_blob0、sqlite3_column_bytesO、sqlite3column_text0、sqlite3_column_double0、sqlite3_column_int0等。经过sqlite3_pre-pare过的SQL语句若不再使用,应该用sqlite3_finalize0使该语句作废。 3SQLite在检验仪器开发中的应用作者参与开发的某检测仪以ARM2440为硬件平台,通过FPGA连接若干步进电机、泵等设备;以Linux2.6.29为操作系统,用QTEmbedded作为开发语言。主要功能是通过注射器加注样品到检测器,通过光电检测,读取每个样品的测试值,生成检验报告:此外还有一些辅助设备如除气装置等部件。在开发过程中,把所有的动作参数存储到一个动作库中,可以大大方便调试修改动作参数,加快开发进度。下面以注射模块的参数修改保存功能为例说明。首先在主程序的开始处。 检测用户存放动作的数据库文件是否存在。并打开。 intmain(intargc,char4+argv){QApplicationapp(argc,argv);intreteode;retcode=sqlite3_open_v2(”par.db”,&serbase.db,SQI_JTE_OPEN—READWRITE,o);if(retcode!=SQLITEOKl{sqlite3_close(serbase.db);std::cout<<”Couldnotopenpar.db\Il”< 可以将其存人数据库中。同样先构造SQL语句。 voidSyringe::PushButton_Save_clicked0{stmt2=O:QStringst2=”updatesyringe_parsetdiu_vol=:pl,pos_z=:p2,inj_spd=:p3,inj_delay2:p4wheretest_name=:p5”;retcode=sqlite3_prepare—v2(serbase.db,st2,一l,&stmt2,咄if(retcode资料!=SQurIE—DK){sqlite3一elose(serbase.db);std::cout<<”CouldnotexecuteUPDATE”< |
Copyright 2009-2011 By www.vipcqsf.com All Right Reserved 本站版权所有. 传奇合击私服网 权威资料与开区发布. |