50-对sqldatasource控件使用开放式并发

上传人:第*** 文档编号:31310352 上传时间:2018-02-06 格式:DOCX 页数:19 大小:504.47KB
返回 下载 相关 举报
50-对sqldatasource控件使用开放式并发_第1页
第1页 / 共19页
50-对sqldatasource控件使用开放式并发_第2页
第2页 / 共19页
50-对sqldatasource控件使用开放式并发_第3页
第3页 / 共19页
50-对sqldatasource控件使用开放式并发_第4页
第4页 / 共19页
50-对sqldatasource控件使用开放式并发_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《50-对sqldatasource控件使用开放式并发》由会员分享,可在线阅读,更多相关《50-对sqldatasource控件使用开放式并发(19页珍藏版)》请在金锄头文库上搜索。

1、1在前面的教程里,我们考察了如何为 SqlDataSource 控件添加插入、更新、删除功能。简而言之,就是为其 nsertCommand, UpdateCommand 和 DeleteCommd 属性赋以相应的 INSERT,UPDATE 和 DELETESQL 语句,并将相应的参数放置在, 和标签里。我们可以手工书写这些代码,也可以通过在设置数据源向导里单击“高级” 按钮,选择“自动生成 INSERT, UPDATE 和 DELETE 命令”,自动的生成语句。在“高级 SQL 生成选项” 对话框里有个“ 使用开放式并发 ”选项(见图 1)。当选择该项后,数据库中的数据在自上一次成功保存以来

2、没发生任何改变的情况下,才能成功地执行更新或删除操作。图 1:在“高级 SQL 生成选项 ”对话框添加开放式并发支持在 Implementing Optimistic Concurrency 教程路我们探讨了开放式并发控制的基本原理以及如何对 ObjectDataSource 控件使用开放式并发。在本教程我们看如何对SqlDataSource 控件使用开放式并发。新的开放式并发在一个允许多人同时编辑或删除相同数据的应用程序里,有这种可能:一个人修改后的记录意外地被另一个人修改的记录所覆盖。在 Implementing Optimistic Concurrency 这篇教程我们例举过这样的例子:

3、2例如,假设两个用户,Jisun 和 Sam,都访问我们的应用软件中的一个页面,这个页面允许访问者通过一个 GridView 控件更新和删除产品数据。他们都同时点击 GridView 控件中的 Edit 按钮。Jisun 把产品名称更改为 “Chai Tea”并点击 Update 按钮,实质结果是向数据库发送一个 UPDATE 语句,它将更新此产品的所有可修改的字段(尽管 Jisun 实际上只修改了一个字段:ProductName)。在这一刻,数据库中包含有这条产品记录“Chai Tea”种类为 Beverages、供应商为 Exotic Liquids、等该产品的详细信息。然而,在 Sam

4、的屏幕中的 GridView 里,当前编辑行里显示的产片名称依旧是“Chai”。在 Jisun 的更改被提交后片刻,Sam 把种类更改为“Condiments”并点击 Update 按钮。这个发送到数据库的UPDATE 语句的结果是将产品名称更改为“Chai”、CategoryID 字段的值是种类 Beverages对应的 ID,等等。Jisun 所作的对产品名称的更改就被覆盖了。图 2 展示了这些连续的事件图 2:当两个用户同时更新一条记录,则存在一个用户的更改覆盖另一个的更改的可能性为了应对这种可能性,我们必须执行某种并发控制。本文的焦点开放式并发控制便是其中之一,它适合于这种情况:假定并

5、发冲突只是偶尔发生,绝大多数的时候并不会出现。 当发生一个冲突时,仅仅简单的告知用户,他所作的更改不能保存,因为别的用户已经修改了同一条记录。3注意:对应用程序来说,假定并发冲突经常发生,且无法容忍。在这种情况下最后用保守式并发控制。关于保守式并发控制的更多讨论,请参考Implementing Optimistic Concurrency 教程。开放式并发控制的作用在于:确保要更新或删除的记录的值与该记录在 updating or deleting 阶段的值相同。比如,例如,当在一个可编辑的 GridView 里点击编辑按钮时,该记录的原始值从数据库中读取出来并显示在 TextBox 和其他

6、Web 控件中。这些原始的值保存在 GridView 里。随后,当用户完成他的修改并点击更新按钮,这些原始值加上修改后的新值发送到业务逻辑层,然后到数据访问层。数据访问层必定发出一个 SQL 语句,它将仅仅更新那些开始编辑时的原始值根数据库中的值一致的记录。图 3 描述了这些事件发生的顺序。4图 3:为了更新或删除能够成功,原始值必须与数据库中相应的值一致有多种方法可以实现开放式并发控制(查看 Peter A. Bromberg 的文章 Optmistic 5Concurrency Updating Logic,从摘要中看到许多选择)。SqlDataSource 控件使用该方法(就像数据访问层

7、中 ADO.NET 类型的数据集使用的那样)扩展 WHERE 字句,用以包含用来做比较的原始值。例如下面的 UPDATE 语句,当当前数据库中的值与 GridView 中开始编辑的原始值一致才更新某个产品的名称和价格。ProductName 和 UnitPrice 参数包含的是用户输入的新值,而参数original_ProductName 和 original_UnitPrice 则包含最初点击编辑按钮时加载到 GridView 中的值:UPDATE Products SETProductName = ProductName,UnitPrice = UnitPriceWHEREProductI

8、D = original_ProductID ANDProductName = original_ProductName ANDUnitPrice = original_UnitPrice就像我们将在本教程看到的一样,使 SqlDataSource 能实现开放式并发控制是很简单的事情。第一步:创建一个支持开放式并发的 SqlDataSource 控件打开 SqlDataSource 文件夹中的 OptimisticConcurrency.aspx 页面,从工具箱拖一个SqlDataSource 控件到页面,设置其 ID 为ProductsDataSourceWithOptimisticConc

9、urrency。在其智能标签里点 “设置数据源”,数据库选为“NORTHWINDConnectionString”,点下一步。6图 4:选“ORTHWINDConnectionString”数据库在此例子里,我们将添加一个 GridView 控件以编辑表 Products。所以在“Configure the Select Statement”界面选择从表 Products 返回 ProductID, ProductName, UnitPrice 和Discontinued 列,如图 5 所示:7图 5:从表 Products 返回 ProductID, ProductName, UnitPri

10、ce 和 Discontinued 列然后,点“高级”按钮,打开“Advanced SQL Generation Options”对话框,选择“Generate INSERT, UPDATE, and DELETE statements”和“Use optimistic concurrency”2项,点“OK”(见图 1)。再点下一步、完成,结束设置。完成设置数据源向导后,花几分钟查看 DeleteCommand 和 UpdateCommand 属性,以及 DeleteParameters 和 UpdateParameters 标签。最快的方法是切换到“ 源模式”直接在页面代码查看,你会看到

11、UpdateCommand 的值像这样:UPDATE Products SETProductName = ProductName,UnitPrice = UnitPrice,Discontinued = DiscontinuedWHEREProductID = original_ProductID ANDProductName = original_ProductName AND8UnitPrice = original_UnitPrice ANDDiscontinued = original_Discontinued同时在 标签里有 7 个参数:.同样的,DeleteCommand 属性和

12、标签如下:DELETE FROM ProductsWHEREProductID = original_ProductID ANDProductName = original_ProductName ANDUnitPrice = original_UnitPrice ANDDiscontinued = original_Discontinued9.选择了“Use optimistic concurrency”选项后,不仅扩展了 UpdateCommand 和DeleteCommand 属性里的 WHERE 字句(同时在相关参数集里添加了参数),同时调整了以下 2 个属性:1. 将 Conflic

13、tDetection 属性由“OverwriteChanges”(默认值)改为 “CompareAllValues ”2. 将 OldValuesParameterFormatString 属性由“0” (默认值)改为 “original_0”当数据 Web 控件调用 SqlDataSource 的 Update()或 Delete()方法时,它将传递原始值。当 SqlDataSource 的 ConflictDetection 属性设置为“CompareAllValues”时,就会将这些原始值添加到命令中。而 OldValuesParameterFormatString 属性则为这些原始值提

14、供了命名规范,向导以“original_0”的形式为 UpdateCommand 和 DeleteCommand 中的原始值以及和 中的参数命名。注意:由于我们没有使用 SqlDataSource 控件的插入功能,因此可以将 InsertCommand 属性和标签清除。正确地处理 NULL 值不幸的是,当使用开放式并发的时候,由设置数据源向导自动生成的、扩展成包含WHERE 字句的 UPDATE 和 DELETE 命令不能处理那些含有 NULL 值的记录。为什么呢?先看 SqlDataSource 的 UpdateCommand 语句:UPDATE Products SETProductNam

15、e = ProductName,10UnitPrice = UnitPrice,Discontinued = DiscontinuedWHEREProductID = original_ProductID ANDProductName = original_ProductName ANDUnitPrice = original_UnitPrice ANDDiscontinued = original_Discontinued表 Products 的 UnitPrice 列的值允许为 NULL,如何某条记录的 UnitPrice 确实为NULL,那么 WHERE 字句的 “UnitPrice =

16、 original_UnitPrice”总是为 False,NULL = NULL 总是返回 False。所以凡是 y 包含 NULL 值的记录不能被编辑或删除,因为UPDATE 和 DELETE 命令中的 WHERE 字句不能返回记录。注意:这个漏洞最早于 2004 年 6 月报告给微软,据业内传言,微软将在 ASP.NET 的下一个版本修补该漏洞。为修补该漏洞,我们需要在 UpdateCommand 和 DeleteCommand 属性里手工修改所有允许为 NULL 值的列。一般来说,将ColumnName = original_ColumnName to 改成:(ColumnName IS NULL AND original_ColumnName IS NULL)OR(ColumnN

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 中学教育 > 其它中学文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号