ASP.NET 2.0数据教程之五十:对SqlDataSource控件使用开放式并发

返回“ASP.NET 2.0数据教程目录”

导言:

在前面的教程里,我们考察了如何为SqlDataSource控件添加插 入、更新、删除功能。简而言之,就是为其nsertCommand, UpdateCommand和 DeleteCommd属性赋以相应的INSERT,UPDATE和DELETESQL语句,并将相应的参数放 置在

<InsertParameters>, <UpdateParameters>和 <DeleteParameters>标签里。我们可以手工书写这些代码,也可以通过在 设置数据源向导里单击“高级”按钮,选择“自动生成INSERT, UPDATE和DELETE命令”,自动的生成语句。

在“高级SQL生成 选项”对话框里有个“使用开放式并发”选项(见图1)。当

选择该项后,数据库中的数据在自上一次成功保存以来没发生任何改变的 情况下,才能成功地执行更新或删除操作。


图1:在“高级SQL生成选项”对话框添加开放式并发支持

在 Implementing Optimistic Concurrency教程路我们探讨了开放式并发控制的基本 原理以及如何对ObjectDataSource控件使用开放式并发。在本教程我们看如何对 SqlDataSource控件使用开放式并发。

新的开放式并发

在一个允许 多人同时编辑或删除相同数据的应用程序里,有这种可能:一个人修改后的记录 意外地被另一个人修改的记录所覆盖。在Implementing Optimistic Concurrency 这篇教程我们例举过这样的例子:

例如,假设两个用户,Jisun和Sam,都 访问我们的应用软件中的一个页面,这个页面允许访问者通过一个GridView控件 更新和删除产品数据。他们都同时点击GridView控件中的Edit按钮。Jisun把产品 名称更改为“Chai Tea”并点击Update按钮,实质结果是向数据库发 送一个UPDATE语句,它将更新此产品的所有可修改的字段(尽管Jisun实际上只修 改了一个字段:ProductName)。在这一刻,数据库中包含有这条产品记录 “Chai Tea”—种类为Beverages、供应商为Exotic Liquids、 等该产品的详细信息。然而,在Sam的屏幕中的GridView里,当前编辑行里显示的 产片名称依旧是“Chai”。在Jisun的更改被提交后片刻,Sam把种类 更改为“Condiments”并点击Update按钮。这个发送到数据库的 UPDATE语句的结果是将产品名称更改为“Chai”、CategoryID字段的 值是种类Beverages对应的ID,等等。Jisun所作的对产品名称的更改就被覆盖了 。

图2展示了这些连续的事件


图2:当两个用户同时更新一条记录,则存在一个用户的更改覆盖另一 个的更改的可能性

时间: 2024-12-31 08:22:09

ASP.NET 2.0数据教程之五十:对SqlDataSource控件使用开放式并发的相关文章

ASP.NET 2.0数据教程之五十一:为GridView控件添加Radio Buttons列

返回"ASP.NET 2.0数据教程目录" 第51到53章为优化GridView系列 导言: GridView控件提供了大 量的内置功能.它包含了一系列的域(field)来显示诸如text.images. hyperlinks和buttons.另外它支持模板(template)用于用户自定义界面.我们 可以构建这样一个GridView控件,用户仅需要点击控件里的一个按钮,每一条记 录行都可以选择.编辑.删除.除了控件本身内置的功能外,在某些情况下,我 们添加一些额外的.控件没有内置的功

ASP.NET 2.0数据教程之五十九:体系分层缓存数据

返回"ASP.NET 2.0数据教程目录" 导言: 正如前面章节所言,缓存ObjectDataSource的数据只需要简单的设 置一些属性.然而,它是在表现层对数据缓存,这就与ASP.NET page页面缓存策 略(caching policies)紧密的耦合(tightly couples)起来.我们对体系机构分层 的原因之一便是打破这种耦合.拿业务逻辑层为例,将业务逻辑从ASP.NET页面脱 离出来:而数据访问层将数据访问的细节ASP.NET页面脱离出来.从某种意义来说 ,将业务逻

ASP.NET 2.0数据教程之五十八:用ObjectDataSource缓存数据

返回"ASP.NET 2.0数据教程目录" 导言 就计算机科学而言,caching就是将所需要的数据或信息的备份放 在某个地方,便于快速访问的这样一个过程.以数据处理(data-driven)程序为 例,程序的大部分时间浪费在数据查询上.要提升这种程序的性能,通常的做法 是将查询结果存放在程序的存储器里. ASP.NET 2.0提供了各种各样的缓 存方式.对web页面和用户控件可以通过output caching进行缓存:同样我们可以 通过ObjectDataSource 和SqlDa

ASP.NET 2.0数据教程之五十六:添加新记录时包含一个文件上传选项

返回"ASP.NET 2.0数据教程目录" 导言: 在前面2节教程,我们探讨了如何使用FileUpload控件从客户端 向服务器上传文件,以及如何在数据Web控件里显示二进制数据. 在本节 ,我们将创建一个web页面以添加新的种类.除了为类的name和description属性 添加TextBoxes控件外,我们还要在页面上添加2个FileUpload控件 --一个用来上传新类的图片,另一个用来上传类的小说明册子.上 传的图片将直接存储在新记录的Picture列.与此相反,小册子将存储

ASP.NET 2.0数据教程之五十四:上传文件

返回"ASP.NET 2.0数据教程目录" 导言: 到目前为止,我们的教程围绕的是text数据.然而,很多应用 程序既需要处理text数据,也需要处理二进制数据.比如招聘网站可能需要用户 上传Word或PDF格式的简历. 使用二进制数据面临一项挑战:在应用程序 中如何存储二进制数据.我们必须更新添加记录的界面以支持用户上传本地电脑 中的文件,并添加额外的功能以下载某条记录的相关二进制数据.本章以及接下 来的3章,我们探讨如何处理这些问题.在本系列教程结束时,我们将创建一个功 能完善的应

ASP.NET 2.0数据教程之五十二:为GridView控件添加Checkboxes列

返回"ASP.NET 2.0数据教程目录" 导言: 在前面的教程里我们探讨了如何为GridView控件添加radio buttons列.当用户最多只能选择一项数据时,我们可以在用户界面里添加radio buttons列,而有时候,我们需要选择任意多项数据.比如,基于Web的邮箱客户 端列出了一系列的邮件,及一列checkboxes,用户可选择任意封邮件并执行相同 的操作,比如移动到另一个文件夹或将之删除. 在本教程,我们将探讨如 何添加checkboxes列,以及发生页面回传后如何确定

ASP.NET 2.0数据教程之七十五: 用Managed Code创建存储过程和用户自定义函数

返回"ASP.NET 2.0数据教程目录" ASP.NET 2.0数据教程之七十五: 用Managed Code创建存储过程和用户自定义函数(下) 第八步:从表现层调用Managed Stored Procedures 当对数据访问层和 业务逻辑层进行扩充以支持调用GetDiscontinuedProducts 和 GetProductsWithPriceLessThan这2种managed stored procedures后,我们可以 在一个ASP.NET页面里展示这些存储过程的结

ASP.NET 2.0数据教程之六十二:创建一个用户自定义的Database-Driven Site Map

返回"ASP.NET 2.0数据教程目录" ASP.NET 2.0数据教程之六十二:创建一个用户自定义的Database-Driven Site Map Provider 导言: ASP.NET 2.0的网站地图(site map)功能允许页面开发者在一些 持久介质(persistent medium),比如一个XML文件里,自己定义一个web程序的 site map.一旦定义了之后,我们可以通过System.Web命名空间的SiteMap class 类或某个Web导航控件,比如Si

ASP.NET 2.0数据教程之三十二:数据控件的嵌套

返回"ASP.NET 2.0数据教程目录" 导言 除了静态HTML和数据绑定语法,template也可以包含Web控件和用 户控件.这些控件的属性可以通过声明语法,数据绑定语法或在服务器端通过事件 处理编程来设置. 通过将控件嵌入到template里,可以自定义界面,提升用 户体验.例如,在在GridView控件中使用TemplateField 里,我们学习了如何通过在 GridView的TemplateField里加一个Calendar控件来表示员工的雇佣日期.在给编 辑和新增界面增