2008年7月19日星期六

Sybase移动数据库Pocket PC客户端编程

一、前言

随着科学技术的飞速发展,人们已经不满足于坐在难以移动的PC机面前,来完成大量的业务信息处理工作,而很多时候人们更希望能够实现移动办公,移动办公方式对于那些经常出差或者现场工作的人员更是尤为重要。
Sybase移动数据库应用解决方案应时而出,完美地解决了这一问题,使移动办公从梦想变成现实,令信息的流动与获取无处不在,随心所欲!

二、Sybase移动数据库解决方案

Sybase移动数据库解决方案从软件架构的角度看,可以将其分为以下3个组成部分:
1、统一数据库
统一数据库,顾名思义就是企业核心数据的存储数据库。统一数据库可以是Sybase ASE/ASA数据库,Oracle数据库,IBM DB2数据库与MS SQL Server数据库等。统一数据库中的数据应该是一个移动数据库应用系统中的数据集散中心,可以为各个移动设备上的移动数据库提供数据或接收来自移动数据库的新增数据。你可以通过位于SQL Anywhere安装路径下的\MobiLink\setup下面的不同脚本来创建不同产品类型的统一数据库,例如你可以通过syncora.sql脚本文件来创建Oracle类型的统一数据库。
2、Mobilink同步服务器

Mobilink同步服务器是一个非常优秀的移动数据库同步服务器,它可以说是移动数据库与统一数据库之间得以进行数据同步通信的通道与桥梁,移动设备上的移动数据库可以向Mobilink服务器发送数据同步请求,Mobilink同步服务器通过解析来自移动客户端的同步请求,进而与统一数据库进行通信以完成数据同步过程。另外,除了Mobilink自身所具备的功能之外,你还可以通过其所提供接口机制开发、扩展其功能。
3、移动数据库

Sybase的移动数据库终端产品分为两种:一种为 ASA移动数据库,另一种是 Ultralite移动数据库。这两种移动数据库终端产品都可以运行在目前较为流行的移动设备终端系统上,如:Windows CE, Windows Mobile, Symbian, Palm等等。与这些操作系统相匹配的设备有:Pocket PC, Nokia 手机,Palm设备等等。运行于这些移动设备上的移动数据库应用可以通过GPRS无线网络与Internet网络与统一数据库进行信息交换。


限于篇幅关系,这里仅讲解Sybase移动数据库应用Pocket PC客户端的编程技术,如果读者朋友对Sybase移动数据库的整体解决方案感兴趣,我会在后期进一步讲解Mobilink同步服务器编程技术以及统一数据库,Mobilink同步服务器与移动数据库集成的应用解决方案开发技术。
三、开发移动终端数据库应用

上面我们已经简单地对Sybase的整体移动数据库解决方案的基本架构做了简要的介绍,同时我们也提到了Sybase移动数据库产品有两种:一种为ASA数据库,一种为Ultralite数据库。本文将以 Ultralite移动数据库为例讲解Pocket PC移动客户端移动数据库的应用开发技术。采用的开发工具为Microsoft Visual Studio 2005,Pocket PC设备上的操作系统为Windows Mobile 5.0。
你可以从下面的Sybase的官方站点上直接下载Developer版。http://www.sybase.com/detail?id=1016644
下载并安装Sybase移动数据库产品SQL Anywhere 10。
1、创建Sybase ULtralite数据库
为了使用Ultralite数据库并操作其中的数据,对于SQL Anywhere 10之前的版本,我们必须先创建一个模式文件,然后根据模式文件创建一个与之匹配的Ultralite数据库文件.udb。在SQL Anywhere 10版本中,已经不需要再创建一个模式文件了。我们只需要创建一个.udb数据库文件,就可以将这个.udb文件与Visual Studio 2005工程集成到一起发布到移动设备上。你可以通过Sybase Central在这个数据库中创建数据表,或者向数据表中添加数据,也可以只创建一个空数据库,然后通过程序创建数据表或者添加数据。下面我们通过Sybase Central创建一个名字为mydb.udb的Ultralite空数据库。
首先,你可以在开始菜单中,打开Sybase Central工具,如下图所示:



图1-1 启动SQL Anywhere 10
然后选择Sybase Central中的工具主菜单,创建Ultralite数据库,如下图所示:




图1-2 创建Ultralite数据库
点击上图中的创建数据库菜单项,你将看到如下图所示的界面:



图1-3 创建Ultralite数据库首界面
直接点击下一步按钮,得到如下图所示的窗口。



图1-4 创建包含Windows CE的数据库组件界面
选中包含Windows Mobile 的 Windows CE选项,然后点击下一步按钮,得到如下图所示的窗口。



图1-5 指定ULtralite数据库名称
在上图中的文本框中,填入d:\udb\mydb,然后点击下一步按钮,得到如下图所示的界面。




图1-6 提示是否设置数据库加密界面
通常使用上图中的缺省值,直接点击下一步按钮,进入下一个界面,如下图所示。


图1-7 选择归类序列界面
在上图中,你可以为当前要创建的数据库选择字符集,这里我们选择GBK字符集,作为当前Ultralite数据的字符集。点击下一步按钮,得到如下图所示的界面。



图1-8 个性化设置界面
不改变上图中的缺省设置,点击下一步按钮,得到如下图所示的界面。




图1-9 装载受信任的根证书界面
由于我们在本例中不涉及安全同步的问题,因此,在上图中直接点击下一步按钮,得到如下图所示的界面。



图1-10 指定要连接的数据库名称
点击上图中的完成按钮,将弹出如下图所示的对话框。




图1-11 完成创建界面
如果创建数据库成功,在上图中将显示“创建数据库已完成”的信息。点击关闭按钮关闭上面的对话框。至此为止,你已经成功的创建了Ultralite数据库。
然后,我们就可以到d:\udb目录下找到,刚才创建的数据库文件mydb.udb。在创建了Ultralite数据库之后,我们再来看一下有关如何在Visual Studio 2005环境下,开发Ultralite移动数据库应用的相关技术知识。
2、查询Sybase ULtralite数据库的数据
在本书前面的章节中,我们已经讨论过如何通过Visual Studio 2005创建ULtralite移动数据库应用工程。下面我们看一下在此基础上,如何配置、开发移动数据库应用工程。在你创建了一个移动应用工程后,你需要将SQLAnywhere Studio 10安装目录下的%SAS_HOME%\ ultralite\UltraLite.NET\ce\assembly\v2\iAnywhere.Data.UltraLite.dll文件添加到当前工程的引用中,如下图所示:



图1-12 在Visual Studio 2005中添加iAnywhere.Data.UltraLite.dll类库界面
然后,你需要再将SQLAnywhere Studio 10安装目录下的%SAS_HOME%\ultralite\UltraLite.NET\ce\armt\ ulnet10.dll添加到工程中。具体的添加步骤如下:
1右键点击当前工程名称,在弹出菜单中选择Add菜单,然后点击Existing Item..菜单,在弹出的窗口中,找到ulnet10.dll文件,然后以连接的方式添加(Add As Link),如下图所示:




图1-13在Visual Studio 2005中添加ulnet10.dll文件界面
将ulnet10.dll添加到工程之后,你还需要设置该文件的关键属性,如下图所示:




图1-14 设置Build Action界面
最后再以同样的步骤添加我们前面创建的Ultralite数据库文件mydb.udb到当前的工程中,只不过在添加时不是以连接的方式添加,而是选择直接添加的方式(Add)将该文件添加到工程中,其关键属性的设置与ulnet10.dll的完全相同。再做完上述的工作之后,我们就可以做进一步的开发工作了。接下来,我们来看一下如何读取ULtralite数据库中的数据(注意:本例中我们引用的ULtralite数据库中并没有包含任何数据表(table),后面将讲解如何创建ULtralite数据库中的数据表)的相关技术知识。
与传统的数据库应用开发一样,要查询数据库中的数据,我们必须首先创建一个数据库连接,然后通过该连接读取数据库中的数据。打开Ultralite数据库连接的代码如下所示:
… …
using iAnywhere.Data.UltraLite;

private string udbFile = "\\Program Files\\ULtraliteProject\\mydb.udb";

public
ULConnection GetDBConnection(string usmfile, string udbfile)
{

ULConnection conn = null;

try

{

ULConnectionParms parms = new ULConnectionParms();

parms.DatabaseOnDesktop = udbFile;

parms.DatabaseOnCE = udbFile;

conn = new ULConnection(parms.ToString());

conn.Open();

}

catch (Exception ex)


{

throw ex;

}

return conn;
}

… …
注意在上面的代码中的using iAnywhere.Data.UltraLite;一行的意义是,引用Ultralite数据库的API。变量udbFile存储了指向Ultralite数据库文件的目录,注意在\\Program Files\\ULtraliteProject\\mydb.udb串中,只有工程名称UltraliteProject与数据库文件mydb.udb随着工程的不同而变化,通常来讲Program Files部分是固定不变的。在得到一个ULConnection连接对象之后,你可以通过向下面的方法中传入查询SQL语句,先创建一个ULDataReader对象,然后通过ULDataReader对象读取数据,如下所示:
… …
using iAnywhere.Data.UltraLite;

public void GetDataReader(string sqlText)

{

ULConnection connection = GetDBConnection(usmFile, udbFile);

ULCommand cmd = connection.CreateCommand();


cmd.CommandText = sqlText;

ULDataReader dataReader = cmd.ExecuteReader();

// 读取数据

while (dataReader.Read())

{

MessageBox.Show(dataReader.GetValue(0).ToString());

}



// 关闭DataReader对象

dataReader.Close();

// 关闭ULConnection对象

connection.Close();
}
… …
上面方法中的DataReader对象,你可以理解为结果集对象(ResultSet)。下面我们再来看一下如何更新ULtralite数据库的数据的相关技术知识。
3、更新ULtralite数据库的数据
在得到ULConnection基础上,更新Ultralite数据库中的数据是非常简单的。如下面的实例代码所示:
… …
using iAnywhere.Data.UltraLite;

public void UpdateData(string sqlText)
{

ULConnection connection = GetDBConnection(usmFile, udbFile);

ULCommand cmd = connection.CreateCommand();

cmd.CommandText = sqlText;
// 执行更新操作

cmd.ExecuteNonQuery();


// 关闭ULConnection对象

connection.Close();

}
… …
上面方法中的参数是一个含有Update,Insert,Delete,Create等数据管理类型的SQL语句,同样我们也需要先通过ULConnection对象创建一个ULCommand对象,然后执行ULCommand对象中的ExecuteNonQuery()方法更新数据。
下面给出一个具体的创建数据表,插入数据的代码执行序列,如下所示:
… …


ULCommand cmd = conn.CreateCommand();



cmd.CommandText = "create table test (name varchar(30) primary key)";


cmd.ExecuteNonQuery();

cmd.CommandText = "insert into test values('user1')";

cmd.ExecuteNonQuery();

cmd.CommandText = "insert into test values('用户名')";

cmd.ExecuteNonQuery();

conn.Close();
… …
删除ULtralite数据库中的数据的过程与此类似。这里就不再一一赘述了。
四、结束语

上面讲解了有关Sybase移动数据库解决方案的基本架构与产品组成,重点讲解了移动设备Pocket PC上的Ultralite移动数据库的编程技术。值得一提的是,上面并未给出Pocket PC上Ultralite数据库与统一数据库进行同步的代码,这是因为这部分编程技术与Mobilink同步服务器编程的关系更为紧密,如果有机会作者希望在后续的章节中给出。最终通过一个完成的应用例子来系统的讲解基于Sybase移动数据整体解决方案的开发技术。

没有评论: