欢迎来到天天文库
浏览记录
ID:40509388
大小:511.04 KB
页数:17页
时间:2019-08-03
《四十八:对SqlDataSource控件使用开放式并发》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、在ASP.NET2.0中操作数据之四十八:对SqlDataSource控件使用开放式并发作者:heker2007字体:[增加 减小]类型:转载时间:2016-05-16 我要评论本文主要讲解ASP.NET2.0中SqlDataSource控件通过配合SQL语句达到控制开放式并发的目的,通过在UPDATE和DELETE语句里扩展WHERE字句,SqlDataSource能应对绝大部分情况。导言: 在前面的教程里,我们考察了如何为SqlDataSource控件添加插入、更新、删除功能。简而言之,就是为其nsertCommand,Upd
2、ateCommand和DeleteCommd属性赋以相应的INSERT,UPDATE和DELETESQL语句,并将相应的参数放置在,和标签里。我们可以手工书写这些代码,也可以通过在设置数据源向导里单击“高级”按钮,选择“自动生成INSERT,UPDATE和DELETE命令”,自动的生成语句。 在“高级SQL生成选项”对话框里有个“使用开放式并发”选项(见图1)。当选择该项后,数据库中的数据在自上一次成功保存以来没发生任何改变
3、的情况下,才能成功地执行更新或删除操作。图1:在“高级SQL生成选项”对话框添加开放式并发支持 在实现开放式并发教程路我们探讨了开放式并发控制的基本原理以及如何对ObjectDataSource控件使用开放式并发。在本教程我们看如何对SqlDataSource控件使用开放式并发。新的开放式并发 在一个允许多人同时编辑或删除相同数据的应用程序里,有这种可能:一个人修改后的记录意外地被另一个人修改的记录所覆盖。在ImplementingOptimisticConcurrency这篇教程我们例举过这样的例子: 例如,假设两个用户,J
4、isun和Sam,都访问我们的应用软件中的一个页面,这个页面允许访问者通过一个GridView控件更新和删除产品数据。他们都同时点击GridView控件中的Edit按钮。Jisun把产品名称更改为“ChaiTea”并点击Update按钮,实质结果是向数据库发送一个UPDATE语句,它将更新此产品的所有可修改的字段(尽管Jisun实际上只修改了一个字段:ProductName)。在这一刻,数据库中包含有这条产品记录“ChaiTea”—种类为Beverages、供应商为ExoticLiquids、等该产品的详细信息。然而,在Sam的屏幕
5、中的GridView里,当前编辑行里显示的产片名称依旧是“Chai”。在Jisun的更改被提交后片刻,Sam把种类更改为“Condiments”并点击Update按钮。这个发送到数据库的UPDATE语句的结果是将产品名称更改为“Chai”、CategoryID字段的值是种类Beverages对应的ID,等等。Jisun所作的对产品名称的更改就被覆盖了。图2展示了这些连续的事件图2:当两个用户同时更新一条记录,则存在一个用户的更改覆盖另一个的更改的可能性 为了应对这种可能性,我们必须执行某种并发控制。本文的焦点——开放式并发控制便是
6、其中之一,它适合于这种情况:假定并发冲突只是偶尔发生,绝大多数的时候并不会出现。当发生一个冲突时,仅仅简单的告知用户,他所作的更改不能保存,因为别的用户已经修改了同一条记录。 注意:对应用程序来说,假定并发冲突经常发生,且无法容忍。在这种情况下最后用保守式并发控制。关于保守式并发控制的更多讨论,请参考ImplementingOptimisticConcurrency教程。 开放式并发控制的作用在于:确保要更新或删除的记录的值与该记录在updatingordeleting阶段的值相同。比如,例如,当在一个可编辑的GridView里
7、点击编辑按钮时,该记录的原始值从数据库中读取出来并显示在TextBox和其他Web控件中。这些原始的值保存在GridView里。随后,当用户完成他的修改并点击更新按钮,这些原始值加上修改后的新值发送到业务逻辑层,然后到数据访问层。数据访问层必定发出一个SQL语句,它将仅仅更新那些开始编辑时的原始值根数据库中的值一致的记录。图3描述了这些事件发生的顺序。图3:为了更新或删除能够成功,原始值必须与数据库中相应的值一致 有多种方法可以实现开放式并发控制(查看PeterA.Bromberg的文章 OptmisticConcurrencyU
8、pdatingLogic,从摘要中看到许多选择)。SqlDataSource控件使用该方法(就像数据访问层中ADO.NET类型的数据集使用的那样)扩展WHERE字句,用以包含用来做比较的原始值。例如下面的UPDATE语句,当当前数据库
此文档下载收益归作者所有