在当前的嵌入式工控产品中,数据库得到了越来越多的应用。通过数据库,可以非常方便地存储和检索数据,极大地提高工作效率。英创公司基于WinCE的ARM9工控主板,提供了两种类型的数据库,供客户的应用程序选择。一种是WinCE自带的数据库,主要面对需要存储的数据量较小,数据结构相对简单的应用,例如系统的动态配置文件,则使用起来非常合适。另一种则是在PC中最流行的SQL数据库,英创ARM9工控主板缺省配置的SQL数据库版本为SQL CE2.0。在表一中,列出了WinCE自带数据库与SQL CE数据库部分功能的对比,用户可以根据自己的需要,选择合适的数据库。关于WinCE自带数据库的操作请参考《EVC高级编程及其应用开发》WinCE基础数据库编程部分。本文主要讲解在eVC开发环境下,以使用ADOCE 3.1为例详细说明开发SQLCE本地数据库的方法。 表一:WinCE自带数据库与SQLCE数据库功能对照表
WinCE 自带数据库
SQLCE 数据库
开发方式
使用 API 函数操作
使用 SQL 语句操作
数据类型
较少 (9 种 )
较多 (20 种 )
与 pc 端 SQL Sever 数据同步
不支持
支持
更改表字段
不支持
支持
在EVC环境下由于没有提供专门的API函数对SQLCE进行操作,需要通过ADOCE(Active Data Object for Windows CE)组件才能实现对SQLCE数据库的操作。为了方便用户使用SQLCE数据库,利用ADOCE组件技术(ADOCE介绍在附录一中),针对数据库操作中常用的功能,包括创打开数据库、建数据表等,英创提供了一个对SQLCE数据库操作的管理类DBManager,应用程序通过调用该类中提供的API函数,就可以很方便的建立与SQLCE的链接、打开数据库,并可以直接利用SQL语句来对数据库进行建立表、为表添加记录以及查询表中的记录等功能。在eVC环境下通过DBManager类访问SQLCE数据库模型如图1所示。
图1 EVC通过DBManager访问数据库模型
一、DBManager类及派生类说明 DBManager类主要提供打开数据库、执行SQL语句等方法。其头文件声明如下: //函数功能:打开数据库 //入口参数:lpszFileName表示要打开的数据库名称,为绝对路径加文件名。 //出口参数:无 //返 回 值:TRUE:打开数据库成功;FALSE:打开数据库失败 bool OpenDatabase(LPCTSTR lpszDBName); //函数功能:执行SQL语句 //入口参数:lpstrSql为要执行SQL语句的字符串。 //出口参数:无 //返 回 值:TRUE:执行SQL语句成功;FALSE:执行SQL语句失败 bool ExecSql(LPCTSTR lpstrSql); 如果想灵活使用DBManager类对数据库操作,必须了解SQL语句,常用SQL语句可以参考附录二中的内容。但是,对于嵌入式工程师来说,有很多用户对SQL语句并不了解,这样,对用户使用数据库提高了门槛。在实际应用中,嵌入式主板的主要任务是把采集工业现场的状态并保存到数据库中,如果想查看分析数据,可以通过WebServer把数据库信息传输到Client端。为了方便不了解SQL语句的用户使用数据库,我们在基类DBManager中提供了几个虚函数,并给出在派生类中实现虚函数的例子。这样,使用API函数就可以实现打开数据库、创建表、插入记录等操作。用户可以根据要保存数据结构修改虚函数就可以满足用户操作数据库的要求,下面以一个实际示例说明使用派来类的方法。
在工业现场,用户常常需要把现场的状态保存起来,例如,把AD采集的数据和开关量保存起来。本文中,以英创的ETA197 AD模块和ETA716 IO模块为例,说明数据库的操作。ETA197、ETA716与嵌入式主板的连接如图2所示。
图2 嵌入式主板与ETA197、ETA716连接示意图
根据实际情况,我们需要保存的信息有时间、IO输出值、IO输入值、8通道AD采样值,根据我们的需要,我们设计ADDIOData数据结构如下。 struct ADDIOData { CString adtime; //采集信息的时间 UCHAR dout; //IO输出值 UCHAR din; //IO输入值 float Advalue[8]; //AD采样值 }; 根据此数据结构,我们实现了创建表和插入记录的API函数,函数声明如下: class ADDataBase : public DBManager { public: //函数功能:创建表 //入口参数:tablename表示要创建的表名。 //出口参数:无 //返 回 值:TRUE:创建表成功;FALSE:创建表失败 bool CreateTable(LPCTSTR tablename); //函数功能:删除表 //入口参数:tablename表示要删除的表名。 //出口参数:无 //返 回 值:TRUE:删除表成功;FALSE:删除表失败 bool DeleteTable(LPCTSTR tablename); //函数功能:插入记录 //入口参数:tablename表示表名,fieldVal为记录值结构体 //出口参数:无 //返 回 值:TRUE:插入记录成功;FALSE:插入记录失败 bool InsertRecord(LPCTSTR tablename,ADDIOData fieldVal); };二、使用DBManager类及派生类实现创建表、插入记录等操作的顺序为: (1)打开数据库 (2)创建表 (3)插入记录 ADDataBase dbm; CString DBFile=_T('\\nandflash\\emtronix.sdf'); CString TableName=_T('ADCollection'); UserInfo test; dbm.OpenDatabase(DBFile); //打开数据库,参数为数据库路径名 dbm.CreateTable(TableName); //创建表 for (i=0;i<6;i++) //每秒钟采集一次数据 { test.dout=0x01<ISA_WriteUchar(EM9260_CS1,0x10,test.dout); //写716输出端口 ISA_ReadUchar(EM9260_CS1,0x10,&test.din); //读716输入端口 for (j=0;j<8;j++) { getADValue(j,0,&test.Advalue[j]); //得到8通道AD采样值 } dbm.InsertRecord(TableName,test); //向tablename表中插入记录 Sleep(1000); } 由上例可以看出,使用英创公司提供的DBManager的派生类,不必了解数据库就可以方便地实现数据的存储。 这种操作数据库的方式不是十分灵活,对熟悉数据库的用户,可以使用DBManager类,执行SQL语句,灵活对数据库操作。关于DBManager类,可以参考源码中注释说明。附录一、ADOCE简介 ADOCE(Active Data Object for Windows CE)技术提供了高层数据库应用软件的访问接口,可在eVC、eVB等高级语言环境中直接使用,ADOCE是一种易用的COM组件,关于COM组件的开发与调用在《ARM9工控板在远程监控中的应用》系列文章中有详细的说明。ADOCE作为开发WinCE数据库应用程度的面向对象的COM接口,其访问数据库是通过访问OLE DB数据提供程序来进行的,并且提供了一种对OLEDB数据提供程序的简单高层访问接口。ADOCE技术简化了OLE DB的操作,在OLE DB的程序中使用了大量的COM接口,而ADOCE则封装了这些接口,所以,ADOCE是一种高层的访问技术。ADOCE的数据存储模型如图1 所示:
图1 ADOCE的数据存储模型
ADOCE支持Connection、Recordset、Field、Fields、Error对象,但不支持Command对象、Property对象以及Properties collection。下面介绍几个重要的ADOCE对象。 连接对象(Connection) Connection对象建立一个对象数据源的数据交换环境,ADOCE允许建立对ACCESS数据源和SQLCE数据源的连接。 记录集对象(Recordset) Recordset对象是ADOCE数据操作的核心,它是查询结果的集合,可以通过这个结果集处理来自数据源的数据,包括修改记录、更新记录、插入和删除记录等。可以通过Recordset的Open方法执行SQL语句,实现数据库的操作。 字段对象(Field) ·字段对象的每条记录都由Fields组成,其中包括名称、数据和值。 ·基于ADOCE的WinCE数据库开发程序包括以下基本步骤: ·创建Connection对象 ·打开数据源,建立同数据源的连接 ·创建Record对象 ·将Recordset的连接字符串设置到Connection对象中 ·使用SQL命令 ·通过Recordset对象完成结果记录集的操作 ·终止连接附录二、SQL语句语法说明 SQL是Structure Query Language结构化查询语言的缩写,通过SQL语句的执行,可以对数据库内容(表及记录)进行修改或查询,因此数据库的操作就是执行SQL语句。下面简要介绍下几个重要的SQL语句。 1、Create Table语句功能是创建表,其语法格式如下: Create Table 表名称 (字段名称 数据类型 [(字段长度)] [,字段名称 数据类型 [(字段长度)] ,[ PRIMARY KEY | UNIQUE ] ] 例如: CREATE TABLE Products (ProductID int,Name nvarchar(255), PRIMARY KEY (ProductID) 2、Drop Table语句的功能是将一个现存于数据库内的表删除,其所使用的语法与格式如下所示: Drop Table 表名称 3、Select语句可以对表的记录作查询、统计。由于Select语句使用比较灵活,我们以几个具体的例子讲价Select的用法。 Select 字段名称 [,字段名称] From 表名称 其中,From关键词是设置来源表名称,使用时可以设置使用一个或多个表,而表名称间以逗号分隔。在搜寻结果中取出所需的字段内容,设置的字段名称以逗号分隔,如果要取得表上的所有字段,可直接用“*”表示。 SELECT * FROM Products WHERE ProductID='02' Where关键词是设置查询记录条件,用以取得所有符合设置条件内容的记录。在条件设置中可以使用 > 、<、=等比较符号,而对于多项条件的判断也可以利用AND,OR等逻辑操作数来连接。 4、插入记录 INSERT INTO 表名[(field1[, field2[, ...]])] VALUES (value1[, value2[, ...]] 例如:INSERT INTO Products (ProductID,Name) VALUES (1,'EM9000嵌入式模块') 5、删除记录 DELETE FROM 表名 WHERE criteria 例如:DELETE FROM 表名 WHERE ProdutcID=01 6、更新记录 UPDATE 表名 SET newvalue WHERE criteria; 例如:Update Products set Name=’EM9161嵌入式主板’ where ProdcutID=01 在eVC环境下,对数据的开发,其实就是通过ADOCE COM组件执行SQL语句的过程。为了使用户方便的使用ADOCE,我们提供了DBManager类,通过此类,可以方便的建立与数据库的连接、执行sql语句等操作。