XML Web Service!XML Web Service!XML Web Service 无处不在!当然,您早就知道这一点。但是,如果您没有加入使用 XML Web Service 的行列,就无法读懂有关 XML Web Service 的文章。亲自用过后,我发现 XML Web Service 是极其有用的。 给我留下最深印象的是什么?主要有三点:
- 创建 XML Web Service 非常容易。
- 我的客户和第三方可以使用 XML Web Service 迅速找到有用信息。
- XML Web Service 配合 Microsoft? Office 一起使用非常容易。
但是,我再次发现对构造集成的 Microsoft Office 和 XML Web Service 解决方案的需求尚未得到满足。我发现自己经常需要将已被序列化为 XML 并已通过 XML Web Service 传输的 ADO.NET 数据集应用到使用 Microsoft Office 创建的解决方案中。有这种需求的不止我一个,我在新闻组中看到有很多人都要求有完成这一任务的便捷方法。由于 Microsoft .NET 刚刚问世,因此 Microsoft Office 的当前版本不能提供现成的解决方案以使用 ADO.NET 数据。但是这也并非完全没有可能。
在本文中,我将介绍如何通过可以重复使用的方法将 XML Web Service 提供的 ADO.NET 数据集应用到 Microsoft Office 中。这里介绍的解决方案可以与 Microsoft Office XP 和 Microsoft Office 2000 配合使用。Microsoft Visual Basic? for Applications (VBA) 源代码还要求具备 MSDN SOAP Developer Center中提供的 Microsoft SOAP Toolkit 3.0 和 Microsoft XML (MSXML) Core Services 4.0 库。
首先,我们需要查看已被序列化为 XML 的数据集的结构。然后,在了解了 XML 的结构之后,我们将讨论两种在 Microsoft Office 中使用这些数据的方法。
获得数据集首先,让我们来看看我在文章一开始的评价中提到的第一点:创建 XML Web Service 的便捷性。在 Microsoft Visual Studio? .NET 中,我介绍了一个可以返回 ADO.NET 数据集的简单函数。仅需添加 <WebMethod()> 属性,我就可以立即将同样的代码转换为 XML Web Service:
| Private sConnNwind As String = "Data Source=localhost;" & _ "Initial Catalog=northwind;" & _ "User ID={UserID};" & _ "password={Password}" <WebMethod()> Public Function RunQuery() As DataSet Dim cn As SqlConnection = New SqlConnection(sConnNwind) Dim cmd As SqlCommand = New SqlCommand("SELECT * from Orders", cn) Dim da As SqlDataAdapter = New SqlDataAdapter() da.SelectCommand = cmd cn.Open() Dim dsAuthors As DataSet = New DataSet() da.Fill(dsAuthors) cn.Close() Return dsAuthors End Function |
Visual Studio .NET 使所有这一切变得如此便捷!我简直无法想像如果编写代码先将其转换为 XML 文档,然后再转换为 SOAP 消息以作为 XML Web Service 传输会多么繁琐。不仅如此,我根本不想在 Visual Basic .NET 代码上花费太多时间;这些概念在 MSDN 上随处可见。对于这一代码节选,您应该注意主要两点:
- 该函数可以运行来自罗斯文数据库的查询并返回数据集。
- <WebMethod()> 属性对该函数进行标记,使其作为 XML Web Service 可见。
还需要顺便提一下,数据集类似于 ADO Recordset 对象,但功能要强大得多。它可以将查询的多个结果及其关系存储在 DataSet 对象中,最重要的是,它可以将包含的数据序列化为 XML 流。
同样,当 RunQuery 函数被调用时,ADO.NET 会连接到罗斯文 Microsoft SQL Server? 数据库,并将查询结果检索至 DataSet 对象。此时,函数即可返回数据集。.NET 能够序列化数据集,并且 XML 流会被发送回调用者。已序列化的数据集类似于如下所示:
| <?xml version="1.0" encoding="utf-8"?> <DataSet xmlns="http://tempuri.org/WS_XML"> <xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> <xs:element name="NewDataSet" msdata:IsDataSet="true"> <xs:complexType> <xs:choice maxOccurs="unbounded"> <xs:element name="Table"> <xs:complexType> <xs:sequence> <xs:element name="OrderID" type="xs:int" minOccurs="0" /> <xs:element name="CustomerID" type="xs:string" minOccurs="0" /> <xs:element name="EmployeeID" type="xs:int" minOccurs="0" /> <xs:element name="OrderDate" type="xs:dateTime" minOccurs="0" /> <xs:element name="RequiredDate" type="xs:dateTime" minOccurs="0" /> <xs:element name="ShippedDate" type="xs:dateTime" minOccurs="0" /> <xs:element name="ShipVia" type="xs:int" minOccurs="0" /> <xs:element name="Freight" type="xs:decimal" minOccurs="0" /> <xs:element name="ShipName" type="xs:string" minOccurs="0" /> <xs:element name="ShipAddress" type="xs:string" minOccurs="0" /> <xs:element name="ShipCity" type="xs:string" minOccurs="0" /> <xs:element name="ShipRegion" type="xs:string" minOccurs="0" /> <xs:element name="ShipPostalCode" type="xs:string" minOccurs="0" /> <xs:element name="ShipCountry" type="xs:string" minOccurs="0" /> </xs:sequence> </xs:complexType> </xs:element> </xs:choice> </xs:complexType> </xs:element> </xs:schema> <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> <NewDataSet xmlns=""> <Table diffgr:id="Table1" msdata:rowOrder="0"> <OrderID>10248</OrderID> <CustomerID>VINET</CustomerID> <EmployeeID>5</EmployeeID> <OrderDate>1996-07-04T00:00:00.0000000-05:00</OrderDate> <RequiredDate>1996-08-01T00:00:00.0000000- 05:00</RequiredDate> <ShippedDate>1996-07-16T00:00:00.0000000- 05:00</ShippedDate> <ShipVia>3</ShipVia> <Freight>32.38</Freight> <ShipName>Vins et alcools Chevalier</ShipName> <ShipAddress>59 rue de l'Abbaye</ShipAddress> <ShipCity>Reims</ShipCity> <ShipPostalCode>51100</ShipPostalCode> <ShipCountry>France</ShipCountry> </Table> <Table diffgr:id="Table2" msdata:rowOrder="1"> <OrderID>10249</OrderID> <CustomerID>TOMSP</CustomerID> <EmployeeID>6</EmployeeID> <OrderDate>1996-07-05T00:00:00.0000000-05:00</OrderDate> <RequiredDate>1996-08-16T00:00:00.0000000- 05:00</RequiredDate> <ShippedDate>1996-07-10T00:00:00.0000000- 05:00</ShippedDate> <ShipVia>1</ShipVia> <Freight>11.61</Freight> <ShipName>Toms Spezialit?ten</ShipName> <ShipAddress>Luisenstr. 48</ShipAddress> <ShipCity>Münster</ShipCity> <ShipPostalCode>44087</ShipPostalCode> <ShipCountry>Germany</ShipCountry> </Table> </NewDataSet> </diffgr:diffgram> </DataSet> |
该 XML 序列化数据集包括两个主要部分:
- XML 架构(常缩写为 XSD)部分,其中包含有关 XML 文档中数据的结构信息。
- 第二部分实际上包含来自查询的数据。正如您所看到的,本文档中讲述的 XML 序列化数据集是来自我们的 SQL Server 数据库的自包含、可移植的数据表示形式。它包括表格结构、数据类型和元素中的数据。
该信息对 Microsoft Office 用户有用吗?当然有用。Microsoft Office 完全是为了使数据和信息有用、相关并可操作。随着 XML Web Service 在 Internet 和企业内部网络上的不断扩展,Microsoft Office 用户会希望利用 XML Web Service 所提供的信息。我对 Microsoft Office 用户真正钦佩的原因之一便是他们能够在获得原始数据后对其进行研究、压缩、改变,或采取他们所需的任何方式对其进行处理,以运用这些数据来完成自己的工作。Microsoft Office 为用户提供了对数据进行此类处理时所需的工具,而且最重要的是,我不用再编写更多的代码来解决问题了,因为这些工具可以更好地解决他们。
其实,真正的原因是我想偷懒。我想用友好的 Microsoft Office 方式为用户提供数据,然后让用户自己处理这些数据。
了解该信息后,是否就可以在 Microsoft Office 的桌面上根据自己的需要重组这些数据呢?是的。我将在本文的后半部分向您介绍如何利用 Microsoft Excel 的内置方法来使用 XML 序列化数据集,以及如何完全灵活地运用使用 VBA 代码的自定义解决方案通过任一 Office 应用程序做到这一点。
静态页面:http://www.qqread.com/soft-engineering/e045114102.html相关专题
- Office技巧专区 (7092篇文章)
- ADO.NET实用技巧 (6339篇文章)
- .NET移动与嵌入式技术 (5950篇文章)
- .NET开发手册 (5652篇文章)
- ADO和ADO.NET的比较和迁移 (223篇文章)
- ADO.NET与其它语言比较篇 (223篇文章)
- .NET实用开发 (1678篇文章)
- .NET与数据库 (473篇文章)
- 软件设计的十二个最佳步骤 (35次浏览)
- 深入理解敏捷开发的常见九大误区 (20次浏览)
- 从瀑布模型、极限编程到敏捷开发 (13次浏览)
- CMMI证书背后的6大怪相 (11次浏览)
- 程序员如何保证代码正确 (3次浏览)
- 敏捷软件开发模型:SCRUM (2次浏览)
- 配置管理变更的关键路径 (1次浏览)
- XFire:轻松简单地开发Web Services (0次浏览)
- Windows或开源:企业级OS之争趋势如何? (0次浏览)
- 浅析软件项目进度管理中的积习流弊 (0次浏览)



