扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:Farzad Farahbod 来源:IBMDW 2007年9月4日
关键字: DB2 Visual Studio XML 数据 验证
DB2 9 为管理、存储和查询 XML 数据引入了一些新的特性和机制:
本文中的代码示例引用了 CARPOOL 表,该表记录旧金山和圣何塞两地关于合伙用车的信息。清单 1 展示了该表的定义。另外,还需确保数据库启用了 XML。
注意:应确保 SAMPLE 数据库在创建时启用了 XML(见后面的定义)。
本文需要使用 Visual Studio .NET 2005 和 DB2 9。这两个产品的安装很简单。建议先安装 Visual Studio .NET,然后再安装 DB2 9。请记住在安装 DB2 时所输入的用户 ID 和密码,因为在连接 DB2 时要使用它们。
在 DB2 安装期间,应确保启用了 TCP/IP。如果在安装 DB2 之后不确定 TCP/IP 是否被启用,可以执行以下步骤进行检查:
C:\Program Files\IBM\SQLLIB\BIN>
(如果使用默认安装路径的话)。输入 db2set。在返回的结果中,应该可以看到这一行: DB2COMM=tcpip
。 如果还没有为 DB2 启用 TCP/IP,那么可以输入以下命令来启用 TCP/IP:
db2set db2comm=tcpip
db2 update dbm cfg using svcename 50000
db2stop
db2start
安装了 DB2 之后,可以选择创建 DB2 SAMPLE 数据库。如果选择这么做,那么应接受默认设置,但务必选择 XML and SQL objects and data 选项。
为了检查系统设置是否成功,启动 Visual Studio .NET 2005。在 Visual Studio .NET 中,选择 File > New > Project。在 New Project 对话框中,在左侧面板中应该可以看到 IBM Projects
。关闭该对话框。在 Server Explorer 中,连接到 DB2 SAMPLE 数据库(具体步骤请参阅 “Develop proof-of-concept .NET applications, Part 1: Create database objects in DB2 Viper using .NET”(developerWorks,2006 年 5 月))。确认在 Server Explorer 中可以看到 XML Schema Repository
树节点。如果没有看到,那么可能需要重新创建 SAMPLE 数据库,以启用 XML 特性。
CREATE TABLE CARPOOL ( ID INTEGER NOT NULL, FIRSTNAME VARCHAR ( 256 ) , LASTNAME VARCHAR ( 256 ) , TITLE VARCHAR ( 15 ) , PHONE VARCHAR ( 20 ) , CARPOOLINFO XML , CONSTRAINT CARPOOL_PK PRIMARY KEY (ID)) |
这里有两个 XML 模式,CarpoolInfo.xsd 和 USAddressType.xsd,其中 CarpoolInfo.xsd 引用了 USAddressType。
<?xml version="1.0" encoding="utf-8"?> <xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:mstns="http://tempuri.org/XMLSchema.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:include id="USAddress.xsd" schemaLocation="USAddress.xsd" /> <xs:element name="CARPOOLINFO"> <xs:complexType> <xs:sequence> <xs:element name="StartTime" type="xs:string" /> <xs:element name="Address" type="USAddress" /> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> |
<?xml version="1.0" encoding="utf-8"?> <xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema.xsd" xmlns:mstns="http://tempuri.org/XMLSchema.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:complexType name="USAddress"> <xs:sequence> <xs:element name="Add1" type="xs:string"> </xs:element> <xs:element name="Add2" type="xs:string"> </xs:element> <xs:element name="City" type="xs:string"> </xs:element> <xs:element name="State" type="xs:string"> </xs:element> <xs:element name="Zip" type="xs:string"> </xs:element> </xs:sequence> </xs:complexType> </xs:schema> |
CARPOOL 表既包含基于 SQL 数据类型的列,又包含一个基于新的 DB2 XML 数据类型的列。后一个列,即 CARPOOLINFO,存储包括合伙用车者的地址和开始时间等信息的 XML 文档。图 1 展示了示例 carpoolnfo XML 文档。
现在来看看如何插入、更新和验证 CARPOOLINFO 列中的 XML 文档。清单 2 展示了一个 XML 模式,在将一个 XML 文档插入 CARPOOLINFO 列之前,需要使用这个 XML 模式对该 XML 文档进行验证。
为了编译和运行 .Net 应用程序,需要创建一个新的 Visual Studio .Net 项目。如果之前没有使用过 Visual Studio .Net,那么可以看看下面关于如何完成这些任务的概述:
首先需要建立到目标数据库的一个连接。清单 4 是用于建立 DB2 数据库连接的一个方法的片段。
private DB2Connection m_conn = null; m_conn = new DB2Connection("database=sample"); m_conn.Open(); |
DB2 9 允许用户注册 XML 模式,并在插入输入文档之前,根据这些模式对输入文档进行验证。XML 模式是 World Wide Web Consortium(W3C)业界标准的一部分。用户可以通过 XML 模式指定 XML 文档应遵从的结构,例如可接受的 XML 元素的顺序和数据类型,以及特定 XML 名称空间的使用。 DB2 Visual Studio 2005 Add-in 工具提供了一种使用简单的注册设计器来注册 XML 模式的简单方法,不过本文将展示如何使用 .Net 代码注册 XML 模式。一旦在 DB2 XML 模式库中注册了一个 XML 模式,便可以用该模式来验证 XML 文档。清单 5 展示了使用 .Net 代码注册 XML 模式的一种方法。
//We have two xsds, CarpoolInfo.xsd and USAddress.xsd, //where CarpoolInfo.xsd is dependent on USAddress.xsd. //This XML Schema is identified as schema.xsdname. String[] xsdFiles = new String[2] { "CarpoolInfo.xsd", "USAddress.xsd" }; String[] schemaLocs = new String[2] { "http://tempuri.org/CarpoolInfo.xsd", "USAddress.xsd" }; // Register XML schema using DB2 .Net provider connection’s // RegisterXmlSchema API m_conn.RegisterXmlSchema(schema, xsdname, schemaLocs, xsdFiles, null, null, false); |
至此,已经建立了 DB2 连接并注册了 XML 模式,现在可以编写 SQL INSERT 或 UPDATE 语句,以便将新的 XML 数据插入到包含 XML 列的表中,并在插入 XML 数据之前,让 DB2 验证 XML 数据。DB2 可以存储最大为 2GB 的格式良好的任何 XML 文档。清单 6 展示了将一行插入到 CARPOOL 表中的一种方法。在这个例子中,插入到 CARPOOLINFO 列的 XML 文档是从字符串读取的。
// Update the database based on the user's action in the dataGrid. // Performs INSERT, UPDATE and DELETE. private void update() { mydataSourceDT = carpoolInfo.DataSource as DataTable; dtChanges = mydataSourceDT.GetChanges(); if (dtChanges == null) return; // Need to generate insert/update/delete commands to //validate against // carpoolinfo.xsd DB2Command insert = new DB2Command ("INSERT INTO CARPOOL" + "(FIRSTNAME,LASTNAME,TITLE,PHONE,CARPOOLINFO)" + " VALUES(?,?,?,?," + "XMLVALIDATE(xmlparse (DOCUMENT CAST" + " ( ? as CLOB) PRESERVE WHITESPACE )" + "ACCORDING TO XMLSCHEMA ID " + schema + ".CARPOOLINFO ))"); DB2Command update = new DB2Command ("UPDATE CARPOOL SET FIRSTNAME=?,LASTNAME=?,TITLE=?,PHONE=?," + "CARPOOLINFO=XMLVALIDATE(xmlparse (DOCUMENT CAST " + "( ? as CLOB) PRESERVE WHITESPACE ) " + "ACCORDING TO XMLSCHEMA ID " + schema + ".CARPOOLINFO ) WHERE ID=?"); DB2Command delete = new DB2Command ("DELETE FROM CARPOOL WHERE ID=?"); //Add the Parameters and bind them to the DataTable's //corresponding columns. DB2Parameter fn1 = new DB2Parameter("fn1", DB2Type.VarChar); DB2Parameter fn2 = new DB2Parameter("fn2", DB2Type.VarChar); fn1.SourceColumn = "FIRSTNAME"; fn2.SourceColumn = "FIRSTNAME"; insert.Parameters.Add(fn1); update.Parameters.Add(fn2); DB2Parameter ln1 = new DB2Parameter("ln1", DB2Type.VarChar); DB2Parameter ln2 = new DB2Parameter("ln2", DB2Type.VarChar); ln1.SourceColumn = "LASTNAME"; ln2.SourceColumn = "LASTNAME"; insert.Parameters.Add(ln1); update.Parameters.Add(ln2); DB2Parameter tl1 = new DB2Parameter("tl1", DB2Type.VarChar); DB2Parameter tl2 = new DB2Parameter("tl2", DB2Type.VarChar); tl1.SourceColumn = "TITLE"; tl2.SourceColumn = "TITLE"; insert.Parameters.Add(tl1); update.Parameters.Add(tl2); DB2Parameter ph1 = new DB2Parameter("ph1", DB2Type.VarChar); DB2Parameter ph2 = new DB2Parameter("ph2", DB2Type.VarChar); ph1.SourceColumn = "PHONE"; ph2.SourceColumn = "PHONE"; insert.Parameters.Add(ph1); update.Parameters.Add(ph2); DB2Parameter info1 = new DB2Parameter("info1", DB2Type.Clob); DB2Parameter info2 = new DB2Parameter("info2", DB2Type.Clob); info1.SourceColumn = "CARPOOLINFO"; info2.SourceColumn = "CARPOOLINFO"; insert.Parameters.Add(info1); update.Parameters.Add(info2); DB2Parameter i1 = new DB2Parameter("i1", DB2Type.Integer); i1.SourceColumn = "ID"; update.Parameters.Add(i1); DB2Parameter i2 = new DB2Parameter("i2", DB2Type.Integer); i2.SourceColumn = "ID"; delete.Parameters.Add(i2); da.InsertCommand = insert; da.UpdateCommand = update; da.DeleteCommand = delete; // Perform the update. da.Update(dtChanges); mydataSourceDT.AcceptChanges(); // Refill the dataset, refresh the dataGridView. ds.Clear(); da.Fill(ds, xsdname); } |
现在来看看这段代码。在建立数据库连接之后,该方法创建三个 DB2Command;一个用于插入,一个用于更新,还有一个用于删除。插入和更新命令包含 4 个用于常规列值的参数占位符,而第 5 个参数占位符则用于 XML 列,该方法还使用 DB2 XMLVALIDATE 函数,并将 Carpoolinfo XML 模式传递给它以便进行验证。
至此,已经将数据存储在 CARPOOLINFO 表中,现在可以查询这个表。DB2 允许编写不同类型的查询来提取关系数据和 XML 数据。例如可以编写一个简单的查询来检索整个 XML 文档,或者编写一个基于 XML 和关系查询谓词检索 XML 文档某些部分的查询。本文演示一个这样的查询:
// Populate the dataGrid. // If "All" is selected, all data from the table will be displayed. // if a city's name is selected, only rows whose CARPOOLINFO contain // <City>cityName</City> will be displayed. public void populate(String cityName) { if ( cityName.Equals("All")) { carpoolInfo.DataSource = ds.Tables[xsdname]; } else { xq = "select * from CARPOOL where " + "xmlexists('declare namespace def=\"http://tempuri.org/XMLSchema.xsd\";" + "$c/def:CARPOOLINFO/def:Address[def:City=" + "\"" + cityName + "\"]' passing CARPOOL.CARPOOLINFO as \"c\")" + "order by ID"; DB2DataAdapter da1 = new DB2DataAdapter(xq, m_conn); DataSet ds1 = new DataSet(); da1.Fill(ds1, xsdname); carpoolInfo.DataSource = ds1.Tables[xsdname]; } } |
WHERE 子句使用 DB2 的 XMLExists() 函数限制查询所返回的数据。它规定,返回的 XML 文档只包括在 CARPOOLINFO 的 city 为某个值(San Francisco 或 San Jose)的行中的那些 XML 文档。在这个示例查询中,XMLExists() 指示 DB2 判断一个给定的 XML 文档是否包含一个包括指定城市的 CARPOOL 地址。PASSING 子句指定 XML 文档所在的位置(在 carpoolinfo 列中)。
IBM DB2 使程序员可以用熟悉的 SQL 语句更新和删除 XML 数据。为了更新和删除存储在 DB2 中的 XML 数据,可以使用 SQL UPDATE 和 DELETE 语句。这些语句可以包括 SQL/XML 函数,这种函数可根据 XML 列中存储的 XML 元素的值来限制目标行和列。例如,可以删除包含居住在特定城市的合伙用车者的相关信息的行,或者只更新合伙用车的开始时间在某个给定时间段内的合伙用车者的 XML(和非 XML 数据)。由于在 UPDATE 和 DELETE 语句中使用 SQL/XML 函数的语法与在 SELECT 语句中使用这些函数的语法相同,因此不再给出完整的代码示例。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者