EDA365电子论坛网

标题: SQLite在嵌入式Wince中的应用 [打印本页]

作者: Allevi    时间: 2018-10-10 16:37
标题: SQLite在嵌入式Wince中的应用
  随着科学技术的发展,嵌入式系统成为了科技发展的主要领域, Linus和Wince是比较常见的嵌入式系统。嵌入式开发过程离不开数据库的应用,对于嵌入式数据库的选择是必要的。通常,嵌入式系统选择的数据应该尽量小,SQLite[1]在Linux中的应用很广泛,本设计介绍了SQLite作为一款小巧的嵌入式数据库在Wince[2]中的应用实例。
( a6 L; E9 @: f. B+ T' K8 o, j9 s: m, R1 @- G8 P/ Z& F3 K0 C
1 SQLite数据库的介绍与选择* {& M8 C- P$ {' [- B6 t: w

/ f- e2 ]! D' M0 h# [+ e. i! S1.1 SQLite数据库结构
+ }0 \7 e! V; E
6 D, Y% K3 G# CSQLite数据库结构图如图1所示。
% `6 s, ?8 D) R$ C, A4 ]& B; p7 j/ W0 t- V& q# X

. D6 Z/ T$ L7 a% M) Z1.2 SQlite数据库的特点
SQLite是一个开源的嵌入式关系数据库,结构紧凑,可靠性强[3]。有以下特点:% C" ?* A+ N7 J

6 J) K. z: R  |6 q! A(1)使用非常简单。只需要掌握3个核心API函数,大多数的SQL[4]语句都可以使用。
7 m2 r% |1 |% {$ ~- s8 G0 b! G6 {+ e9 G) G
(2)占用很少的存储器空间。SQLite完全独立,数据库引擎和应用程序在同一系统进程中,因此运行速度较高。
' Y2 H' j' g" {# I
# L5 E9 |4 x& ]0 C% T8 T(3)支持ACID事务,在系统出现问题或电源断电时不会出现数据丢失现象。% v+ _" J0 x) O- v7 j& J; F; U

& q" A6 y+ D) K(4)支持多种语言,像C/C++/C#等。
! t1 f: i, E9 H0 c6 h6 u. e& w$ C9 H* e: t
(5)支持多个嵌入式操作系统平台,如Linux系统、Wince系统等。
0 `3 c+ Y+ o' u& [7 l% c9 |4 o$ A; e9 d! w# ?
2 SQlite的选择
7 X! r$ N. {  @$ `* ]( s0 Y
2 F/ I5 q4 G& Q! s8 R9 [0 B首先,SQL Server CE是Wince自身的数据库,必须在Wince系统中安装3个文件才能使用,而SQLite只需要在电脑上安装SQlite-1.0.65.0[5],把生成的SQlite.Interop.065.DLL移植到Wince系统运行的程序中,并在Visual Studio2008写程序时添加一个引用即可,操作较简单。其次SQLite占用很少的存储器空间(150 KB~250 KB),但是SQL Server CE却要占用 1 MB~3 MB的空间。最重要的是SQLite具有良好的移植性,可以应用到多个嵌入式系统,而SQL Server CE只能在Wince中运行。
' M  H' B) k" C! x) x+ `' J
; N6 N# \3 [  t3 SQLite的应用硬件及软件平台
7 X1 `- H2 J  T- o' L* h( \9 G- T2 u# w, K
本文探讨中以S3C2440作为处理器ARM9的硬件平台,以Wince6.0为应用系统,支持.NET2.0平台。在Visual Studio 2008软件平台中用 C#中编写程序,但是在新建项目中选择智能设备时要选择.NET2.0平台。在Visual Studio 2008中用C#编写程序时,第一次使用时要添加引用System.Data.SQLite,在程序中添加using指令集,这样可以通过软件编写程序实现建库建表的功能。8 U2 A; y* V+ e4 q3 ^% ~
1 \8 q0 V+ s9 y2 M
4 SQLite在Wince中的应用实例, s8 N0 c0 u$ P; k
' }; ^9 H0 p! \! a$ M8 `
4.1 Wince中显示数据的控件DataGrid及其属性3 j* A5 g. m/ y1 n4 W
: o( Z. q& t4 X/ {( ^
DataGrid控件实际上是一个固定的列集合,每一列的行数都是不确定的,可以看作一个用来显示数据的网格。它的网格是看不见的,只有建立了数据表,才能看到其中每一行和每一列的具体内容,如果一个单元格的文本太长,就不能在单元格中全部显示。但是在Wince系统中显示数据的控件只有这一个,所以不能完全显示数据这一问题正是本设计所要解决的。图2显示了DataGrid在Wince中的属性。4 q1 W; K7 L- d" a) `- P7 p# Z+ w- c
1 d1 q+ |+ ~; o5 X

, R# g4 Q; C- d6 V/ Q# B2 H4.2 SQLite建数据库的步骤4 }1 b% K+ ?, o! f" F. o+ d# O4 z

9 {, k' d( O" r+ ^" M* j% uSQLite建数据库的步骤如下:/ _% `3 O  o) Q
. W% U# L# p' i, Q2 B
(1)通过SQLiteConnection对数据库进行连接[6],通过软件建数据库,首先要有数据源,如:  y2 g% i/ {6 }  h, a

" X# _$ X# s$ w/ m; }; ISQLiteConnection conn=new SQLiteConnection("Data Source=\\Program Files\\ maindata.db");! }, w) Y8 f3 `* _" t  F3 M: o
: l( t' x0 D1 U/ m. w$ M* O/ ^
对数据库要进行操作需要执行的命令,如SQLiteCommand cmd=new SQLiteCommand();1 z9 U9 J! C+ m' \3 t* N. p& {
2 u: l! |9 x$ c2 ~( H( U
(2)每次使用数据库前需要打开数据库,还需要连接数据库,关闭数据库;. z5 Z8 M3 W" ~2 d" A' u' j
/ e7 J1 U, A/ t- y  B% t
(3)通过 CREATE TABLE SQL语句进行建表。必须给表注上表名,方便下面操作。如:$ u$ ]" S8 l' W2 [1 w
{cmd.CommandText="CREATETABLE ServerLert(Numintrger,BedNum varchar(20),ServerItem varchar(50),ServerTime varchar(30),Passwords varchar(30));"
7 _' K* o; |6 z( I" L4 w1 n- K2 r) [( t" \/ E
(4)可以通过INSERT INTO 语句进行插入数据。如:, T5 a2 Y8 t; z$ \2 w
cmd.CommandText="INSERT INTO ServerLert(Num,BedNum,ServerItem,ServerTime) VALUES(1 ,′2′,′测血糖′,′10-12-10 15:50:00′)";7 }, F$ t; [1 M& a/ h% j

# r6 q$ y7 |: \9 E* E- {; q  w(5)数据库至此建成,由于插入的时间单元格不能完全显示,因此需要通过对图2中标注有灰色背景的TableStyles进行设置[7]。如:; L  G' b$ _$ q9 t
DataGridTableStyle dgts=new DataGridTableStyle();& b/ Y6 r7 i6 _; P4 b
dgts.MappingName=ds.Tables[0].TableName;5 s4 S; r: C! a! a+ ^8 ^* O2 Q
DataGridTextBoxColumn dgtbc=new DataGridTextBoxColumn();
" e+ A" ]6 m, @# f0 ~$ f  xdgtbc.HeaderText=ds.Tables[0].Columns[0].ColumnName;
( c% }" f5 B+ ?% q; udgtbc.MappingName=ds.Tables[0].Columns[0].ColumnName;
( d" {9 s$ F# G6 Q9 ^# o& R  Z  gdgtbc.Width=70;0 J0 v# q$ i; y
dgts.GridColumnStyles.Add(dgtbc);  v& ^8 |8 v3 @  P  ]: d7 b( M0 o, d

$ g5 k% n8 ^$ F) U6 h9 \上面是对表中第一列进行的宽度设置主要是对DataGridTableStyle中列的格式进行设置,这就解决了显示文本过长的问题。第二列设置80,第三列设置了170,在Wince中运行的结果。如图3所示。7 X+ y0 j3 x3 U3 U7 _6 _% l

, L3 o4 T5 O. W# n
2 _4 A4 ^0 H, O% {+ n9 g4.3 Wince通过DataGrid属性建数据库的分析
) ~5 H8 c# o+ O. A: O  S+ M- g
" D  O/ Q+ p$ c' S$ w* cDataGrid在应用于基于Wince的Windows mobile[7]智能设备时,主要针对DataGridTableStyle属性进行设置[8]。根据应用于Windows mobile的原理对基于Wince的ARM9的嵌入式设备中建数据库还是行不通。对其列的属性进行操作设置仍然改变不了列的宽度,所以这种路径行不通。试了很多种方法,最后通过软件编程进行设置,得到了图3的结果。比较DataGridTableStyl进行设置与软件设置发现,问题在于表的MappingName与列的MappingName设置时,必须对应才能实现修改功能。用DataGridTableStyle设置,如果列的MappingName与数据库中的建表的列不对应,则映射不存在,从而找不到网格去显示数据,更无法对数据的列宽进行操作。所以通过软件编程,可以对建在缓存区域中的每一张表中所有的列进行操作,解决文本过长不能完全显示的问题。
; n: j, N  J/ r" [% a' y. |9 Z/ a8 n- e" V
通过上面的介绍可以看出,SQLite作为开源的嵌入式数据库应用在Wince中的一个优点就是建表比较简单,不像SQL CE数据库[9],在Wince运行中需要先创建表,把所建的数据库放在Wince的系统中,添加数据源时再去绑定这个数据源。对于在.net2.0平台建立的数据库[10],添加数据源时无法找到路径,所以这种方法不可行。通过SQLite软件创建数据库的方法则可以改善上述不足。SQLite作为一款小巧的嵌入式数据库,发展前景很大,在基于ARM的Wince操作系统有着广泛应用[11]。
- e8 ^: r. w  i  R+ {8 P% V4 ?

作者: Mhza    时间: 2018-10-10 17:56
学习学习




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2