50对SqlDataSource控件使用开放式并发.docx
- 文档编号:2769812
- 上传时间:2022-11-14
- 格式:DOCX
- 页数:14
- 大小:496.43KB
50对SqlDataSource控件使用开放式并发.docx
《50对SqlDataSource控件使用开放式并发.docx》由会员分享,可在线阅读,更多相关《50对SqlDataSource控件使用开放式并发.docx(14页珍藏版)》请在冰豆网上搜索。
50对SqlDataSource控件使用开放式并发
在前面的教程里,我们考察了如何为SqlDataSource控件添加插入、更新、删除功能。
简而言之,就是为其nsertCommand,UpdateCommand和DeleteCommd属性赋以相应的INSERT,UPDATE和DELETESQL语句,并将相应的参数放置在
我们可以手工书写这些代码,也可以通过在设置数据源向导里单击“高级”按钮,选择“自动生成INSERT,UPDATE和DELETE命令”,自动的生成语句。
在“高级SQL生成选项”对话框里有个“使用开放式并发”选项(见图1)。
当
选择该项后,数据库中的数据在自上一次成功保存以来没发生任何改变的情况下,才能成功地执行更新或删除操作。
图1:
在“高级SQL生成选项”对话框添加开放式并发支持
在ImplementingOptimisticConcurrency教程路我们探讨了开放式并发控制的基本原理以及如何对ObjectDataSource控件使用开放式并发。
在本教程我们看如何对SqlDataSource控件使用开放式并发。
新的开放式并发
在一个允许多人同时编辑或删除相同数据的应用程序里,有这种可能:
一个人修改后的记录意外地被另一个人修改的记录所覆盖。
在ImplementingOptimisticConcurrency这篇教程我们例举过这样的例子:
例如,假设两个用户,Jisun和Sam,都访问我们的应用软件中的一个页面,这个页面允许访问者通过一个GridView控件更新和删除产品数据。
他们都同时点击GridView控件中的Edit按钮。
Jisun把产品名称更改为“ChaiTea”并点击Update按钮,实质结果是向数据库发送一个UPDATE语句,它将更新此产品的所有可修改的字段(尽管Jisun实际上只修改了一个字段:
ProductName)。
在这一刻,数据库中包含有这条产品记录“ChaiTea”—种类为Beverages、供应商为ExoticLiquids、等该产品的详细信息。
然而,在Sam的屏幕中的GridView里,当前编辑行里显示的产片名称依旧是“Chai”。
在Jisun的更改被提交后片刻,Sam把种类更改为“Condiments”并点击Update按钮。
这个发送到数据库的UPDATE语句的结果是将产品名称更改为“Chai”、CategoryID字段的值是种类Beverages对应的ID,等等。
Jisun所作的对产品名称的更改就被覆盖了。
图2展示了这些连续的事件
图2:
当两个用户同时更新一条记录,则存在一个用户的更改覆盖另一个的更改的可能性
为了应对这种可能性,我们必须执行某种并发控制。
本文的焦点——开放式并发控制便是其中之一,它适合于这种情况:
假定并发冲突只是偶尔发生,绝大多数的时候并不会出现。
当发生一个冲突时,仅仅简单的告知用户,他所作的更改不能保存,因为别的用户已经修改了同一条记录。
注意:
对应用程序来说,假定并发冲突经常发生,且无法容忍。
在这种情况下最后用保守式并发控制。
关于保守式并发控制的更多讨论,请参考
ImplementingOptimisticConcurrency教程。
开放式并发控制的作用在于:
确保要更新或删除的记录的值与该记录在updatingordeleting阶段的值相同。
比如,例如,当在一个可编辑的GridView里点击编辑按钮时,该记录的原始值从数据库中读取出来并显示在TextBox和其他Web控件中。
这些原始的值保存在GridView里。
随后,当用户完成他的修改并点击更新按钮,这些原始值加上修改后的新值发送到业务逻辑层,然后到数据访问层。
数据访问层必定发出一个SQL语句,它将仅仅更新那些开始编辑时的原始值根数据库中的值一致的记录。
图3描述了这些事件发生的顺序。
图3:
为了更新或删除能够成功,原始值必须与数据库中相应的值一致
有多种方法可以实现开放式并发控制(查看PeterA.Bromberg的文章 OptmisticConcurrencyUpdatingLogic,从摘要中看到许多选择)。
SqlDataSource控件使用该方法(就像数据访问层中ADO.NET类型的数据集使用的那样)扩展WHERE字句,用以包含用来做比较的原始值。
例如下面的UPDATE语句,当当前数据库中的值与GridView中开始编辑的原始值一致才更新某个产品的名称和价格。
@ProductName和@UnitPrice参数包含的是用户输入的新值,而参数@original_ProductName和@original_UnitPrice则包含最初点击编辑按钮时加载到GridView中的值:
UPDATEProductsSET
ProductName=@ProductName,
UnitPrice=@UnitPrice
WHERE
ProductID=@original_ProductIDAND
ProductName=@original_ProductNameAND
UnitPrice=@original_UnitPrice
就像我们将在本教程看到的一样,使SqlDataSource能实现开放式并发控制是很简单的事情。
第一步:
创建一个支持开放式并发的SqlDataSource控件
打开SqlDataSource文件夹中的OptimisticConcurrency.aspx页面,从工具箱拖一个SqlDataSource控件到页面,设置其ID为ProductsDataSourceWithOptimisticConcurrency。
在其智能标签里点“设置数据源”,数据库选为“NORTHWINDConnectionString”,点下一步。
图4:
选“ORTHWINDConnectionString”数据库
在此例子里,我们将添加一个GridView控件以编辑表Products。
所以在“ConfiguretheSelectStatement”界面选择从表Products返回ProductID,ProductName,UnitPrice和Discontinued列,如图5所示:
图5:
从表Products返回ProductID,ProductName,UnitPrice和Discontinued列
然后,点“高级”按钮,打开“AdvancedSQLGenerationOptions”对话框,选择“GenerateINSERT,UPDATE,andDELETEstatements”和“Useoptimisticconcurrency”2项,点“OK”(见图1)。
再点下一步、完成,结束设置。
完成设置数据源向导后,花几分钟查看DeleteCommand和UpdateCommand属性,以及DeleteParameters和UpdateParameters标签。
最快的方法是切换到“源模式”直接在页面代码查看,你会看到UpdateCommand的值像这样:
UPDATE[Products]SET
[ProductName]=@ProductName,
[UnitPrice]=@UnitPrice,
[Discontinued]=@Discontinued
WHERE
[ProductID]=@original_ProductIDAND
[ProductName]=@original_ProductNameAND
[UnitPrice]=@original_UnitPriceAND
[Discontinued]=@original_Discontinued
同时在
SqlDataSourceID="ProductsDataSourceWithOptimisticConcurrency" runat="server"...> ... ParameterName="ProductName"Type="String"/> ParameterName="UnitPrice"Type="Decimal"/> ParameterName="Discontinued"Type="Boolean"/> ParameterName="original_ProductID"Type="Int32"/> ParameterName="original_ProductName"Type="String"/> ParameterName="original_UnitPrice"Type="Decimal"/> ParameterName="original_Discontinued"Type="Boolean"/> ... SqlDataSource> 同样的,DeleteCommand属性和 DELETEFROM[Products] WHERE [ProductID]=@original_ProductIDAND [ProductName]=@original_ProductNameAND [UnitPrice]=@original_UnitPriceAND [Discontinued]=@original_Discontinued SqlDataSourceID="ProductsDataSourceWithOptimisticConcurrency" runat="server"...> ParameterName="original_ProductID"Type="Int32"/> ParameterName="original_ProductName"Type="String"/> ParameterName="original_UnitPrice"Type="Decimal"/> ParameterName="original_Discontinued"Type="Boolean"/> ... ... SqlDataSource> 选择了“Useoptimisticconcurrency”选项后,不仅扩展了UpdateCommand和DeleteCommand属
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 50 SqlDataSource 控件 使用 开放式 并发
![提示](https://static.bdocx.com/images/bang_tan.gif)