使用 DB2e 引擎开发 DB2 Everyplace XML 同步应用程序

知识背景

DB2 Everyplace XML 同步解决方案架构

DB2 Everyplace 是一个移动设备端数据库引擎和数据同步基础架构的解决方案。包含移动设备上运行的移动数据库,同步客户端和在企业后台运行的同步服务器。如图 1 所示,作为 IBM 普适计算解决方案的一部分,DB2 Everyplace 由下面三个部分组成:

  1. DB2 Everyplace Database Engine 移动数据库:作为嵌入式的关系型数据库,DB2 Everyplace 移动数据库允许不同的手持设备上上的数据可以存放在数据库中进行管理。
  2. DB2 Everyplace 同步客户端: DB2 Everyplace 同步客户端运行于手持设备端负责移动数据库与同步服务器进行同步。除了支持将后台数据与 DB2 Everyplace Database Engine 之间的数据进行同步外,同步客户端还支持另外一种客户端的数据库引擎— Apache Derby 。同步客户端可以将 Derby 与后台数据库之间的数据进行同步。
  3. DB2 Everyplace 同步服务器:作为企业数据源与手持设备移动数据库之间的桥梁,DB2 Everyplace 同步服务器运行于服务器端,并负责管理业务数据库与手持设备上的移动数据库进行双向的数据同步。在 DB2 Everyplace 的同步架构中,会为需要同步的源数据库建立相应的镜像数据库。 Sync server 完成镜像数据库与客户端之间的数据交互过程被称作同步 (Synchronization),而 Sync Server 完成的镜像数据库与后台数据库之间的数据交互被称为复制 (Replication) 。见图 1 。

图 1.DB2 Everyplace 的三个部分以及与源数据库之间的交互
系统架构图 

开发环境配置

配置开发环境的步骤如下 :

  1. 下载并安装 Microsoft Visual Studio,本文中使用 Visual Studio 版本 2005
  2. 下载并安装最新的 DB2 Everyplace 服务器,本文中所使用的是 DB2 Everyplace 版本 9.1.2
  3. 安装 DB2e 引擎中文版到 PocketPC 2003 设备,本文中 PocketPC 2003 设备所使用的是 ARM 处理器
  4. 安装同步客户端中文版到 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)


清单 1.EHR 源数据库创建语句
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 日分别在北医三院和协和医院的医疗记录。


清单 3.源表创建语句
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 地址来进行替换)。接下来我们还需要按照下面的步骤在移动设备管理中心配置一些必需的预定,预定集,用户以及组的具体信息。

  1. 在移动设备管理中心创建一个名为 xGrp 的组;
  2. 在移动设备管理中心创建一个名为 xUser 的用户(密码设置为 xPassWord)并将该用户加入到在 1# 中创建的 xGrp 组;
  3. 创建一个名为 xSubs 的预定集;
  4. 创建一个名为 xSub 的预定并将源数据库 EHRSRC 中的 ehrtable 表作为源表加入到预定中;
  5. 将预定 xSub 放入 xSubs 预定集;
  6. 让组 xGrp 可管理预订集 xSubs ;
  7. 使用清单 5 的命令复制源数据库数据到镜像数据库。

清单 5.复制源数据库
Replicate.bat  EHRMDB

使用同步客户端刷新后台数据到客户端

为了方便用户使用同步客户端,DB2 Everyplace 产品提供了一个样例程序 DB2 Sync 。它使用同步客户端提供的同步 API 来和同步服务器进行双向同步。安装成功同步客户端后,读者可以在 PocketPC 2003 的程序启动组找到 DB2 Sync 。

  1. 配置同步客户端 : 在正式启动同步之前,需要配置一些同步选项。如图 2 所示,本文使用了下面的配置信息。服务器地址:http://9.123.149.103:8080 ;用户名和密码:xUser/xPassWord ;本地路径:/ehrdata 。

    图 2.配置同步客户端
    配置客户端

  2. 启动同步。完成了对客户端配置后,读者可以点击 Synchronize 按钮启动 DB2 Sync 和服务器进行同步。如图 3 所示。

    图 3.DB2 Sync 同步客户端界面。
    sync同步客户端 

    DB2e 数据库 XML 应用开发

    1. 打开 Visual Studio 2005,点击“文件 -> 新建 -> 项目 ",填入项目名称 ehrsync 并点击下一步。(见图 4)

      图 4.创建 c# 项目
      创建c#项目

    2. 点击 "Ok" 。(见图 5)

      图 5.完成项目创建
      完成项目创建

    加入 DB2e 和 XML 支持

    加入步骤如下:

    1. 在 Solution Explorer 视图中,进入 Project 菜单,选择 Properties 并单击 Add Reference 。 加入 IBM.Data.DB2.DB2e.CF.dll 。 ( 见图 6)

      图 6.加入 API 支持
      加入API支持

    2. 单击 OK,完成配置。 ( 见图 7)

      图 7.已加入的库文件
      已加入的库文件

    创建一个类

    1. 双击“ Project->Add Class",填入类名称 EhrHandler 并点击下一步。(见图 8)

      图 8.创建一个类
      创建一个类

    2. 点击 " 完成 " 。
    3. 引入命名空间。 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 的实现代码。


    清单 7.打开数据库连接
    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()); 
            } 
        } 
     }

    查询 XML 数据

    类 EhrHandler 提供了方法 queryXDataFromDB 用来查询 XML 数据。 queryXDataFromDB 首先创建一个语句实例,随后执行 SQL 语句 select idx, xcol from ehrtable 来执行查询。查询结果通过遍历结果集逐条显示。这里 xcol 字段是用二进制存储的,System.Xml 用来解析 xcol 为 XML 字符串类型来显示。清单 8 列出了查询 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()); 
            } 
        } 
     }

    插入 XML 数据

    类 EhrHandler 还提供了方法 addXDataIntoDB 用来向读者展示如何向移动数据库中插入 XML 数据。 addXDataIntoDB 首先创建一个 XML 文档实例,随后使用此实例从电子健康档案文档 \data.xml 中读取相应节点信息。这里搜索 records 子节点中 name 属性为张三的 record 节点,并将其转换为 XML 字符串形式插入数据库。清单 9 列出了插入 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()); 
            } 
        } 
     }

    更新 XML 数据

    类 EhrHandler 提供了方法 updateXDataIntoDB 。这个方法用来向读者展示如何更新 XML 数据。 updateXDataIntoDB 如同 addXDataIntoDB 首先创建一个 XML 文档实例,使用此实例从电子健康档案 \data.xml 中搜索 records 子节点中 name 属性为张三的已被更新的 record 节点,来对数据库中张三的电子健康记录做相应更新。清单 10 列出了更新 XML 数据的实现代码。


    清单 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()); 
            } 
        } 
     }

    删除 XML 数据

    类 EhrHandler 提供了方法 removeXDataFromDB 。这个方法比较简单,它用来向读者展示如何从移动数据库中删除 XML 数据。 removeXDataFromDB 首先创建一个语句实例,随后执行一条 Delete 语句来执行删除。这个方法执行成功后,张三的电子健康档案将会从数据库中删除。清单 11 列出了删除 XML 数据的实现代码。


    清单 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 的实现代码。


    清单 12.关闭数据库连接
    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 应和客户端数据库中的记录完成了同步。


    清单 13.复制镜像数据库
    Replicate EHRMDB

    小结事实上,DB2 Everyplace 产品为开发者使用 DB2e 引擎开发 XML 同步应用提供了非常强大的支持。通过全文的介绍,现在读者已经知道如何用 DB2e 引擎和同步客户端在 PocketPC 平台使用 C #语言开发 XML 同步应用了。所以,接下来读者可以通过阅读相关在线文档或者技术手册来更加深入地去尝试 DB2 Everyplace 的 XML 高级特性的应用开发。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15082138/viewspace-590678/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/15082138/viewspace-590678/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值