好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

开放式并发的解决办法

开放式并发的解决办法

我们知道,因为数据结构是基于断开的数据,所以 ADO.NET 和 Visual Studio .NET 使用开放式并发。因此,您需要添加业务逻辑,以解决开放式并发问题。

如果您选择使用开放式并发,则可以通过两种常规的方法来确定是否已发生更改:版本方法(实际版本号或日期时间戳)和保存所有值方法。

版本号方法

在版本号方法中,要更新的记录必须具有一个包含日期时间戳或版本号的列。当读取该记录时,日期时间戳或版本号将保存在客户端。然后,将对该值进行部分更新。

处理并发的一种方法是仅当 WHERE 子句中的值与记录上的值匹配时才进行更新。该方法的 SQL 表示形式为:

[sql]   view plain copy

UPDATE  Table1  SET  Column1 = @newvalue1, Column2 = @newvalue2  WHERE  DateTimeStamp = @origDateTimeStamp  

或者,可以使用版本号进行比较:

[sql]   view plain copy

UPDATE  Table1  SET  Column1 = @newvalue1, Column2 = @newvalue2WHERE RowVersion = @origRowVersionValue  


如果日期时间戳或版本号匹配,则表明数据存储区中的记录未被更改,并且可以安全地使用数据集中的新值对该记录进行更新。如果不匹配,则将返回错误。您可以编写代码,在 Visual Studio .NET 中实现这种形式的并发检查。您还必须编写代码来响应任何更新冲突。为了确保日期时间戳或版本号的准确性,您需要在表上设置触发器,以便在发生对行的更改时,对日期时间戳或版本号进行更新。

保存所有值方法

使用日期时间戳或版本号的替代方法是在读取记录时获取所有字段的副本。ADO.NET 中的  DataSet  对象维护每个修改记录的两个版本:初始版本(最初从数据源中读取的版本)和修改版本(表示用户更新)。当试图将记录写回数据源时,数据行中的初始值将与数据源中的记录进行比较。如果它们匹配,则表明数据库记录在被读取后尚未经过更改。在这种情况下,数据集中已更改的值将成功地写入数据库。

对于数据适配器的四个命令(DELETE、INSERT、SELECT 和 UPDATE)来说,每个命令都有一个参数集合。每个命令都有用于初始值和当前值(或修改值)的参数。

注意     由于不存在初始记录,添加新记录(INSERT 命令)只需要当前值;移除记录(DELETE 命令)只需要使用初始值来定位要删除的记录。

以下示例显示一个数据集命令的命令文本,该命令更新一个典型的客户表。该命令是为动态 SQL 和开放式并发而指定的。

[sql]   view plain copy

UPDATE  Customers  SET  CustomerID = @currCustomerID, CompanyName = @currCompanyName, ContactName = @currContactName,ContactTitle = currCon   actTitle, Address = @currAddress, City = @currCity,PostalCode = @currPostalCode, Phone = @currPhone, Fax = @currFaxWHERE (CustomerID = @origCusto   merID)  AND  (Address = @origAddress  OR  @origAddress  IS   NULL   AND  Address  IS   NULL )  AND  (City = @origCity  OR  @origCity  IS   NULL   AND  City  IS   NULL ) AND     (CompanyName = @origCompanyName  OR  @origCompanyName  IS   NULL   AND  CompanyName  IS   NULL )  AND  (ContactName = @origContactName  OR     @origContactName  IS   NULL   AND  ContactName  IS   NULL )  AND  (ContactTitle = @origContactTitle  OR  @origContactTitle  IS   NULL   AND  ContactTitle  IS   NULL )   AND  (Fax = @origFax  OR  @origFax  IS   NULL   AND  Fax  IS   NULL )  AND  (Phone = @origPhone  OR  @origPhone  IS   NULL   AND  Phone  IS   NULL )  AND     (PostalCode = @origPostalCode  OR  @origPostalCode  IS   NULL   AND  PostalCode  IS   NULL ); SELECT  CustomerID, CompanyName, ContactName, ContactTitle,    Address, City,PostalCode, Phone, FaxFROM Customers  WHERE  (CustomerID = @currCustomerID)  



请注意,九个 SET 语句参数表示将写入数据库的当前值,而九个 WHERE 语句参数则表示用于定位初始记录的初始值。

前九个 SET 语句参数对应于参数集合中的前九个参数。这些参数会将其  SourceVersion  属性设置为  Current 。

接着的九个 WHERE 语句参数用于开放式并发。这些占位符对应于参数集合中接着的九个参数,这些参数的每一个都将其  SourceVersion 属性设置为 Original 。

SELECT 语句用于在发生更新后刷新数据集。它是您在“高级 SQL 生成选项”对话框中设置“刷新数据集”选项时生成的。

作者: Leo_wl

    

出处: http://www.cnblogs.com/Leo_wl/

    

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

版权信息

查看更多关于开放式并发的解决办法的详细内容...

  阅读:39次

上一篇: CYQ.Data 数据框架 V4.0

下一篇:HTTP协议请求