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 是一个移动设备端数据库引擎和数据同步基础架构的解决方案。包含移动设备上运行的移动数据库,同步客户端和在企业后台运行的同步服务器。如图 1 所示,作为 IBM 普适计算解决方案的一部分,DB2 Everyplace 由下面三个部分组成:
配置开发环境的步骤如下 :
首先我们需要启动 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; |
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 ) |
insert into ehrtable values(1,“ |
最后我们需要启动 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 地址来进行替换)。接下来我们还需要按照下面的步骤在移动设备管理中心配置一些必需的预定,预定集,用户以及组的具体信息。
Replicate.bat EHRMDB |
为了方便用户使用同步客户端,DB2 Everyplace 产品提供了一个样例程序 DB2 Sync 。它使用同步客户端提供的同步 API 来和同步服务器进行双向同步。安装成功同步客户端后,读者可以在 PocketPC 2003 的程序启动组找到 DB2 Sync 。
加入步骤如下:
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 高级特性的应用开发。
学习
获得产品和技术
讨论
|
王飞鹏是 IBM 中国软件开发中心的软件工程师。 | ||
|
齐亮是 IBM 中国软件开发中心的资深软件工程师。 | ||
|
王玉柱,IBM CDL 实习软件工程师,主要从事 DB2 Everyplace 产品相关工作。 | ||
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/15082138/viewspace-536428/ ,如需转载,请注明出处,否则将追究法律责任。