pureXML 是 DB2 9.1 推出的一个具有革命性的功能,推出后在企业应用中得到了广泛应用。 DB2 Everyplace 9.1.2 新增加了将企业存储在后台 DB2 中的 pureXML 数据同步到移动设备上的重要特性,这使得 pureXML 数据可以从服务器端延伸到移动设备上,从而为 XML 应用同步开发提供了便利。电子健康档案(EHR)为提高病人的安全、提高医疗质量、改善健康护理、推进病人康复和降低医疗费用提供了有效的手段。它以数字化的形式汇集了来自不同系统、不同医疗机构的诊疗、保健信息并提供给授权的医疗活动参与方使用。由于这些 EHR 信息是非结构化的,所以可以很方便地通过 XML 的方式来存储这些信息。
本文以实例的方式来开发电子健康档案(EHR)应用程序。通过这个实例,移动应用开发人员可以了解 DB2 Everyplace 基础架构以及如何开发移动设备上的 pureXML 应用程序并将 XML 数据同步到移动设备上。本文提供服务器端配置以及客户端的 C# 代码。客户端使用 PocketPC 2003,移动数据库基于 DB2e 嵌入式数据库。
![]() |
![]() |
- DB2 Everyplace Enterprise Edition 9.1.2 以上
- Microsoft Visual Studio 2005 以上
- PocketPC 2003 以上
![]() |
![]() |
DB2 Everyplace 是一个移动设备端数据库引擎和数据同步基础架构的解决方案。包含移动设备上运行的移动数据库,同步客户端和在企业后台运行的同步服务器。如图 1 所示,作为 IBM 普适计算解决方案的一部分,DB2 Everyplace 由下面三个部分组成:
- DB2 Everyplace Database Engine 移动数据库:作为嵌入式的关系型数据库,DB2 Everyplace 移动数据库允许不同的手持设备上上的数据可以存放在数据库中进行管理。
- DB2 Everyplace 同步客户端: DB2 Everyplace 同步客户端运行于手持设备端负责移动数据库与同步服务器进行同步。除了支持将后台数据与 DB2 Everyplace Database Engine 之间的数据进行同步外,同步客户端还支持另外一种客户端的数据库引擎— Apache Derby 。同步客户端可以将 Derby 与后台数据库之间的数据进行同步。
- DB2 Everyplace 同步服务器:作为企业数据源与手持设备移动数据库之间的桥梁,DB2 Everyplace 同步服务器运行于服务器端,并负责管理业务数据库与手持设备上的移动数据库进行双向的数据同步。在 DB2 Everyplace 的同步架构中,会为需要同步的源数据库建立相应的镜像数据库。 Sync server 完成镜像数据库与客户端之间的数据交互过程被称作同步 (Synchronization),而 Sync Server 完成的镜像数据库与后台数据库之间的数据交互被称为复制 (Replication) 。见图 1 。
图 1.DB2 Everyplace 的三个部分以及与源数据库之间的交互
![]() |
![]() |
配置开发环境的步骤如下 :
- 下载并安装 Microsoft Visual Studio,本文中使用 Visual Studio 版本 2005
- 下载并安装最新的 DB2 Everyplace 服务器,本文中所使用的是 DB2 Everyplace 版本 9.1.2
- 安装 DB2e 引擎中文版到 PocketPC 2003 设备,本文中 PocketPC 2003 设备所使用的是 ARM 处理器
- 安装同步客户端中文版到 PocketPC 2003 设备,本文中 PocketPC 2003 设备所使用的是 ARM 处理器
首先我们需要启动 DB2 控制中心(如果是 Windows 平台可以可以通过双击通过双击“ MS Windows Start menu->All Programs->IBM DB2 ->DB2COPY1(default)->General Administration Tools->Control Center ”来启动)。创建 EHR 源数据库 EHRSRC 和镜像数据库 EHRMDB 。注意,为了支持 XML 同步,需要将 code set 设定为 UTF-8 。(见清单 1 和 清单 2)
CREATE DATABASE EHRSRC AUTOMATIC STORAGE YES ON 'C:\' DBPATH ON 'C:\' USING CODESET UTF-8 TERRITORY US COLLATE USING SYSTEM PAGESIZE 4096; |
清单 2.EHR 镜像数据库创建语句
CREATE DATABASE EHRMDB AUTOMATIC STORAGE YES ON 'C:\' DBPATH ON 'C:\' USING CODESET UTF-8 TERRITORY US COLLATE USING SYSTEM PAGESIZE 4096; |
随后我们连接源数据库 EHRSRC,并使用清单 3 的 DDL 语句创建源表 ehrtable,使用清单 4 的 DML 语句向 ehrtable 中插入 XML 片断数据。 XML 片断的语义依赖于具体应用,本文插入的片断记录了张三于 2007 年 8 月 30 日和 2008 年 6 月 20 日分别在北医三院和协和医院的医疗记录。
CREATE TABLE ehrtable ( "IDX" INTEGER NOT NULL , "XCOL" XML ) |
清单 4.源表数据插入语句
insert into ehrtable values(1,“2007/08/30哮喘赵敏丽2008/06/20咽喉炎王安民”) |
最后我们需要启动 DB2 Everyplace 同步服务器(如果是 Windows 平台可以通过双击“ MS Windows Start menu->All Programs->IBM DB2 Everyplace->Enterprise Edition 9.1->Administration Tools->Start Servlet for SyncServer ”来启动)。接下来我们还需要启动移动设备管理中心来完成服务器端的配置。本文中使用的 DB2 Everyplace 同步服务器的 IP 地址是 9.123.149.103(读者请根据自己同步服务器的 IP 地址来进行替换)。接下来我们还需要按照下面的步骤在移动设备管理中心配置一些必需的预定,预定集,用户以及组的具体信息。
- 在移动设备管理中心创建一个名为 xGrp 的组;
- 在移动设备管理中心创建一个名为 xUser 的用户(密码设置为 xPassWord)并将该用户加入到在 1# 中创建的 xGrp 组;
- 创建一个名为 xSubs 的预定集;
- 创建一个名为 xSub 的预定并将源数据库 EHRSRC 中的 ehrtable 表作为源表加入到预定中;
- 将预定 xSub 放入 xSubs 预定集;
- 让组 xGrp 可管理预订集 xSubs ;
- 使用清单 5 的命令复制源数据库数据到镜像数据库。
清单 5.复制源数据库
Replicate.bat EHRMDB |
为了方便用户使用同步客户端,DB2 Everyplace 产品提供了一个样例程序 DB2 Sync 。它使用同步客户端提供的同步 API 来和同步服务器进行双向同步。安装成功同步客户端后,读者可以在 PocketPC 2003 的程序启动组找到 DB2 Sync 。
- 配置同步客户端 : 在正式启动同步之前,需要配置一些同步选项。如图 2 所示,本文使用了下面的配置信息。服务器地址:http://9.123.149.103:8080 ;用户名和密码:xUser/xPassWord ;本地路径:/ehrdata 。
图 2.配置同步客户端 - 启动同步。完成了对客户端配置后,读者可以点击 Synchronize 按钮启动 DB2 Sync 和服务器进行同步。如图 3 所示。
图 3.DB2 Sync 同步客户端界面。
- 打开 Visual Studio 2005,点击“文件 -> 新建 -> 项目 ",填入项目名称 ehrsync 并点击下一步。(见图 4)
图 4.创建 c# 项目 - 点击 "Ok" 。(见图 5)
图 5.完成项目创建
加入步骤如下:
- 在 Solution Explorer 视图中,进入 Project 菜单,选择 Properties 并单击 Add Reference 。 加入 IBM.Data.DB2.DB2e.CF.dll 。 ( 见图 6)
图 6.加入 API 支持 - 单击 OK,完成配置。 ( 见图 7)
图 7.已加入的库文件
- 双击“ Project->Add Class",填入类名称 EhrHandler 并点击下一步。(见图 8)
图 8.创建一个类 - 点击 " 完成 " 。
- 引入命名空间。 System.Xml 命名空间提供了管理 XML 文档和流的方法集。在本样例中使用 System.Xml 作为 XML 解析器来处理存储在 DB2e 数据库中的以 XML 格式存放的电子健康档案。命名空间 IBM.Data.DB2.DB2e.CF 是 DB2 Everyplace 产品提供的供 .NET 开发人员操作 DB2e 数据库的应用程序开发接口。在本样例中使用 IBM.Data.DB2.DB2e.CF 提供的编程接口来打开、查询、插入、更新、删除和关闭数据库。清单 6 列出了在类 EhrHandler 中需要引用的命名空间列表。
清单 6.引入的命名空间
using System; using System.Collections.Generic; using System.Text using IBM.Data.DB2.DB2e.CF; using System.Data using System.Xml
在用 C# 语言对 DB2e 数据库进行查询、插入、更新和删除操作之前,需要首先打开数据库连接。在类 EhrHandler 中,方法 openDBConnection 首先构建连接串。连接串格式为 @"database= \ehrdata\;uid=db2e;pwd=password" 。随后使用此连接串创建 DB2eConnection 对象。最后打开对 DB2e 数据库 \ehrdata 的连接。后面的查询、增加、更改和删除操作都将使用此连接。清单 7 列出了 openDBConnection 的实现代码。
public static void openDBConnection (string DBconnectStr) { Try { con = new DB2eConnection(DBconnectStr); con.Open(); } catch (DB2eException e1) { int cnt = e1.Errors.Count;for (int i = 0; i < cnt; i++){ MessageBox.Show(e1.Errors[i].SQLState.ToString()); } } } |
类 EhrHandler 提供了方法 queryXDataFromDB 用来查询 XML 数据。 queryXDataFromDB 首先创建一个语句实例,随后执行 SQL 语句 select idx, xcol from ehrtable 来执行查询。查询结果通过遍历结果集逐条显示。这里 xcol 字段是用二进制存储的,System.Xml 用来解析 xcol 为 XML 字符串类型来显示。清单 8 列出了查询 XML 数据的实现代码。
public void queryXDataFromDB() { DB2eCommand cmd = null; try { string cmdstr="select idx, xcol from ehrtable"; cmd = new DB2eCommand(cmdstr, con); DB2eDataAdapter DA = new DB2eDataAdapter(cmd); DB2eCommandBuilder Cbd = new DB2eCommandBuilder(DA); DataSet DS = new DataSet(); DS.Tables.Add("rcd"); DA.Fill(DS.Tables["rcd"]);for (int i = 0; i < DS.Tables["rcd"].Rows.Count; i++){ string idx = DS.Tables["rcd"].Rows[i][0].ToString; Byte[] btos = (Byte[])DS.Tables["rcd"].Rows[i][1]; string xmlserialize=System.Text.Encoding.Default.GetString( btos, 0, btos.Length); System.Console.WriteLine("idx=" + idx + ",xmlserialize=" + xmlserialize); } } catch (DB2eException e1) { int cnt = e1.Errors.Count;for (int i = 0; i < cnt; i++){ MessageBox.Show(e1.Errors[i].SQLState.ToString()); } } } |
类 EhrHandler 还提供了方法 addXDataIntoDB 用来向读者展示如何向移动数据库中插入 XML 数据。 addXDataIntoDB 首先创建一个 XML 文档实例,随后使用此实例从电子健康档案文档 \data.xml 中读取相应节点信息。这里搜索 records 子节点中 name 属性为张三的 record 节点,并将其转换为 XML 字符串形式插入数据库。清单 9 列出了插入 XML 数据的实现代码。
public void addXDataIntoDB() { DB2eCommand cmd = null; try { string insertstr = "insert into ehrtable values(1,'"; XmlDocument xmlDoc = new XmlDocument(); StreamReader sr = new StreamReader("\data.xml"); xmlDoc.Load(sr); // 获取 records 节点的所有子节点 XmlNodeList nodeList = xmlDoc.SelectSingleNode("records").ChildNodes; foreach (XmlNode xn in nodeList) { XmlElement xe = (XmlElement)xn;// 将子节点类型转换为 XmlElement 类型 if (xe.GetAttribute("name") == " 张三 ")// 如果 name 属性值为“张三” { insertstr += xn.OuterXml; break; } } insertstr += "')"; cmd = new DB2eCommand(insertstr, con); cmd.ExecuteNonQuery(); } catch (DB2eException e1) { int cnt = e1.Errors.Count;for (int i = 0; i < cnt; i++){ MessageBox.Show(e1.Errors[i].SQLState.ToString()); } } } |
类 EhrHandler 提供了方法 updateXDataIntoDB 。这个方法用来向读者展示如何更新 XML 数据。 updateXDataIntoDB 如同 addXDataIntoDB 首先创建一个 XML 文档实例,使用此实例从电子健康档案 \data.xml 中搜索 records 子节点中 name 属性为张三的已被更新的 record 节点,来对数据库中张三的电子健康记录做相应更新。清单 10 列出了更新 XML 数据的实现代码。
public void updateXDataIntoDB() { DB2eCommand cmd = null; try { string updatestr = "update ehrtable set xcol='"; XmlDocument xmlDoc = new XmlDocument(); StreamReader sr = new StreamReader("\data.xml"); xmlDoc.Load(sr); // 获取 records 节点的所有子节点 XmlNodeList nodeList = xmlDoc.SelectSingleNode("records").ChildNodes; foreach (XmlNode xn in nodeList) { XmlElement xe = (XmlElement)xn;// 将子节点类型转换为 XmlElement 类型 if (xe.GetAttribute("name") == " 张三 ")// 如果 name 属性值为“张三” { insertstr += xn.OuterXml; break; } } updatastr += "' where idx=2"; cmd = new DB2eCommand(updatestr, con); cmd.ExecuteNonQuery(); } catch (DB2eException e1) { int cnt = e1.Errors.Count;for (int i = 0; i < cnt; i++){ MessageBox.Show(e1.Errors[i].SQLState.ToString()); } } } |
类 EhrHandler 提供了方法 removeXDataFromDB 。这个方法比较简单,它用来向读者展示如何从移动数据库中删除 XML 数据。 removeXDataFromDB 首先创建一个语句实例,随后执行一条 Delete 语句来执行删除。这个方法执行成功后,张三的电子健康档案将会从数据库中删除。清单 11 列出了删除 XML 数据的实现代码。
public void removeXDataFromDB() { DB2eCommand cmd = null; try { String deletestr = "delete from ehrtable where idx=2"; cmd = new DB2eCommand(deletestr, con); cmd.ExecuteNonQuery(); } catch (Exception e1) { int cnt = e1.Errors.Count;for (int i = 0; i < cnt; i++){ MessageBox.Show(e1.Errors[i].SQLState.ToString()); } } } |
在用 C# 语言对 DB2e 数据库进行查询、插入、更新和删除操作之后,需要将数据库连接关闭。在类 EhrHandler 中,方法 openDBConnection 将类成员变量 con 打开,最后在 closeDBConnection 方法中需要将其关闭。清单 12 列出了 closeDBConnection 的实现代码。
public static void closeDBConnection () { Try { con.Close(); } catch (DB2eException e1) { int cnt = e1.Errors.Count;for (int i = 0; i < cnt; i++){ MessageBox.Show(e1.Errors[i].SQLState.ToString()); } } } |
使用类 EhrHandler 提供的方法完成对移动数据库操作后,可以再次使用同步客户端将更改后的数据同步到服务器。具体配置请参考前文同步客户端刷新后台数据到客户端。同步成功后,使用清单 13 的命令复制镜像数据库到源数据库。读者可以通过 DB2 CLP,CLI 或者控制中心连接 EHRSRC 数据库,并检查源表 ehrtable 中同步后的数据。正确的情况下,ehrtable 应和客户端数据库中的记录完成了同步。
Replicate EHRMDB |
![]() |
![]() |
事实上,DB2 Everyplace 产品为开发者使用 DB2e 引擎开发 XML 同步应用提供了非常强大的支持。通过全文的介绍,现在读者已经知道如何用 DB2e 引擎和同步客户端在 PocketPC 平台使用 C #语言开发 XML 同步应用了。所以,接下来读者可以通过阅读相关在线文档或者技术手册来更加深入地去尝试 DB2 Everyplace 的 XML 高级特性的应用开发。
学习
- DB2 Everyplace 信息中心,介绍了 DB2 Everyplace Version 9 的相关产品信息。
- 在DB2 Everyplace developerWorks 专区,中阅读更多有关 DB2 Everyplace 的文章。
- 使用 Derby 引擎开发 DB2 Everyplace XML 同步应用程序,介绍了如何利用 DB2 Everyplace 基础架构将 pureXML 同步到移动设备上。
- 开发基于 DB2 Everyplace 产品的快递解决方案,介绍了一个快递公司的工作场景:邮递员对邮包的分发和获取。
- 在 Symbian 平台上开发 DB2 Everplace Java 应用程序,介绍了使用服务器同步机制将企业数据传递到移动和嵌入设备端。
获得产品和技术
- 下载 DB2 Everyplace 9.1 并使用此软件试用版的功能。
讨论
- 访问DB2 Everyplace 论坛了解有关 DB2 Everyplace 产品的讨论信息。
![]() | ||
![]() | 王飞鹏是 IBM 中国软件开发中心的软件工程师。 |
![]() | ||
![]() | 齐亮是 IBM 中国软件开发中心的资深软件工程师。 |
![]() | ||
![]() | 王玉柱,IBM CDL 实习软件工程师,主要从事 DB2 Everyplace 产品相关工作。 |
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15082138/viewspace-536428/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/15082138/viewspace-536428/