日期:2014-02-01  浏览次数:20442 次

企业领域中的开发工作正日益变为更加利用 Internet 的功能和互操作性。重点已经从开发传统的客户端/服务器应用程序(需要严格定义用于交换数据的数据结构和协议)转向了开发使用 XML 的 Web 应用程序。与传统的客户端/服务器应用程序一样,Web 应用程序也通过 LAN 或 WAN 在不同的逻辑实体之间交换数据。但是,Web 应用程序使用公共 Internet 和 XML,而不使用专用连接和二进制数据格式。在需要访问和更新存储在关系数据库(如 SQLServer)中的数据方面,大多数 Web 应用程序也和客户端/服务器应用程序相似。Web 应用程序必须从 SQL Server 获取 XML 查询结果,并使用 XML 格式的数据更新 SQL Server。Microsoft 已经通过在 SQL Server 2000、XML for SQL Server 2000 (SQLXML) 和 .NET 框架中实现许多技术满足了这些要求。(有关这些技术的概述,请参阅 2002 年 4 月的“Selecting XML Technologies for Queries and Updates”,InstantDoc ID 24342。)这些技术为构建各种 Web 应用程序提供了坚实的基础。但是,经过证明,处理数据库更新总是比较困难。China It Power . ComUpJ5uRS

Microsoft 提供了几个用来更新数据库的选项,包括 OpenXML、XML Bulk Load、updategram 和 Diffgram。我们已经在以前的专栏中研究了 OpenXML 和 XML Bulk Load;现在,该介绍 updategram 和 Diffgram 了。用来快速构建实际 Web 应用程序方案的每种技术都有很大的缺陷。在这些应用程序方案中,数据从某个 Web 应用程序进行请求、在客户端位置进行远程修改,随后返回到该 Web 应用程序,以便所做的修改可以存储在数据库中。在这些方案中,对于 Web 应用程序有三个隐含要求。第一个是对开放式更新的需求。由于客户端和服务器之间的 Internet 连接是异步的、短暂的并且有可能是不可靠的,因此 Web 应用程序需要进行开放式更新。如果没有开放式更新,则由于在超时之前仍有许多锁,应用程序和数据库性能会迅速降低。第二个要求是,客户端不需要(而且不应当预知)数据库结构。第三个要求是,客户端需要一种方法来传送对数据进行的更改(包括并发信息),以便克服多个客户端对服务器进行的竞争更新。Updategram 和 Diffgram 是相似的技术,它们都在不同程度上支持这三个要求。因此,假设您正在构建 Web 应用程序,那么应当使用哪种技术?China It Power . ComUpJ5uRS

UpdategramChina It Power . ComUpJ5uRS

updategram 是一种 XML 文档,它描述对 XML 查询结果进行的更改。结合使用 updategram 和任何 SQLXML Web 版本,可以对数据库进行开放式更新。Updategram 还支持更新数据库中与 XML 中的分层关系相对应的一个或多个表。例如,可以将嵌套在 XML 定单元素中的定单项插入到数据库的 Order 和 LineItem 表中。尽管 updategram 会尝试满足更新数据的三个要求,但是它们在以下几个方面存在缺陷。China It Power . ComUpJ5uRS

首先,ADO、SQL Server、SQLXML 或对象模型(如 XML 文档对象模型 (DOM))不支持 updategram。这种缺陷会从三个方面降低 updategram 的有用性。第一,因为 ADO 和 DOM 不支持生成 updategram,所以您必须实现一个直接生成 updategram 语法的客户端代码。更糟糕的是,这项艰巨的任务不能在项目之间进行缩放;每当您希望生成一个 updategram 时,都必须实现该逻辑。第二,在将数据存储到数据库中之前,Web 应用程序通常需要使用业务逻辑来检验和验证数据。同样,您需要用一个对象模型来表达该业务逻辑(因为该技术使用开放式更新),以便确认在从数据库检索数据之后和尝试更新数据之前之间的这段时间内,数据未发生变化。第三,对象模型在理想情况下可使您能够以一种一致的方式来访问更新的数据和原始值。但是,您也需要实现一个代码,该代码除了执行业务逻辑和并发检查,还要解释 updategram 语法。China It Power . ComUpJ5uRS

Updategram 还有一个缺陷,就是无法调用存储过程来执行数据库更新。因此,通过使用存储过程而实现的业务逻辑、约束和引用完整性都呈现为无用状态。China It Power . ComUpJ5uRS

updategram 用来表达数据集更改的方式可能会造成另一个问题。这些更改是用 XML 而不是关系数据库表达的。尽管用这种方式表达所做的更改通常大有裨益(这是因为它向客户端隐藏了数据库的详细信息),但是它还可能排除某些数据,而在将所做的更改提交到数据库中之前,您可能需要这些数据来验证所做的更改或执行业务逻辑。China It Power . ComUpJ5uRS

最后,updategram 通常的应用方式也存在缺陷。因为 updategram 最适于进行批处理,所以,如果 SQL Server 能够按照它处理 T-SQL UPDATE 语句的方式来处理 updategram 的话,updategram 则会生成最高效的结果。但是,当前的 SQLXML 实现在中间层处理 updategram,并生成由 SQL Server 执行的 SQL 语句,而不是直接处理 updategram。因此,尽管 updategram 从表面看非常适合在 Web 应用程序中更新数据,并且有可能适合一组范围较窄的情形,但是,其缺点限制了对它们的广泛应用。China It Power . ComUpJ5uRS

DiffgramChina It Power . ComUpJ5uRS

Diffgram 是随 ADO.NET 支持一起引入 .NET框架中的。Diffgram 与 updategram 相似,但是能够解决 updategram 中一些固有的最严重的问题。最重要的是,Diffgram 通过 ADO.NET DataSet 对象提供对象模型支持。您可以通过持久性保持一个 Diffgram 格式的 DataSet,来直接从该 DataSet 定义中生成 Diffgram,也可以从持久性 Diffgram 中创建 DataSet。因此,当您构建业务逻辑时,不必编写用来生成 Diffgram 或导航 Diffgram 结构的代码。相反,您只需使用 DataSet 对象来编写代码。您还可以结合使用 DataSet 对象和 DataAdapter 对象,将以 Diffgram 表达的更改提交到数据库中。(DataAdapter 是 ADO.NET 中的一个中间对象,它从数据库中读取数据并将所做的更改更新到数据库。)另外,DataAdapter 支持通过存储过程来进行更新,而且会在对数据进行了并发更新之后,引发一个程序事件。尽管对于程序员来说,Diffgram 比 updategram 方便得多,但是使用 Diffgram 也有一些注意事项。China It Power . ComUpJ5uRS

首先,您需要让 .NET 框架充分利用 Diffgram。.NET 框架和公共语言运行库 (CLR) 尚未完全部署,因此 Web 客户端可能还无法访问 DataSet 的丰富功能,或者可能无法在中间层服务器上使用 .NET 框架。第二,Diffgram 不支持对使用标识列的表进行更新。如果数据库架构使用标识列来自动为某些实体生成唯一的 ID,这些实体随后又用于其他表中的外键,Diffgram 则无法处理更新。例如,当定单及其行项目存储在单独的表中,而且使用一个标识列(例如,定单号)做为 LineItems 表中引用其相关定单的外键时,Diffgrams 则无法成功地将行项目添加到数据库中。唯一的解决办法是亲自编写更新代码,以便取消 Diffgram 的值。更大的障碍是,当不同的复杂类型(在 XML 架构定义 - XSD 中进行定义)使用相同的名称但是位于不同的上下文中时,Diffgram 无法使用 XML。例如,