返回“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:当两个用户同时更新一条记录,则存在一个用户的更改覆盖另一 个的更改的可能性