开放式并发的解决办法

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

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

版本号方法

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

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

  1. UPDATE Table1 SET Column1 = @newvalue1, Column2 = @newvalue2 WHERE DateTimeStamp = @origDateTimeStamp  
或者,可以使用版本号进行比较:
  1. UPDATE Table1 SET Column1 = @newvalue1, Column2 = @newvalue2WHERE RowVersion = @origRowVersionValue  

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

保存所有值方法

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

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

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

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

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


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

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

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

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

 

 

更多WEB開發技術請加群:Asp.Net高级群 群号:261882616

博主以及同事和你共同探討感興趣的話題。

posted @ 2012-10-31 09:48  历史的驱动  阅读(1833)  评论(2编辑  收藏  举报