• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > 在ASP.NET 2.0中操作数据之四十八:对SqlDataSource控件使用开放式并发

在ASP.NET 2.0中操作数据之四十八:对SqlDataSource控件使用开放式并发

作者:heker2007 字体:[增加 减小] 来源:互联网 时间:2017-05-11

heker2007通过本文主要向大家介绍了在ASP.NET 2.0中操作数据之四十八:对SqlDataSource控件使用开放式并发等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

导言:

  在前面的教程里,我们考察了如何为SqlDataSource控件添加插入、更新、删除功能。简而言之,就是为其nsertCommand, UpdateCommand和DeleteCommd属性赋以相应的INSERT,UPDATE和DELETESQL语句,并将相应的参数放置在<InsertParameters>, <UpdateParameters>和<DeleteParameters>标签里。我们可以手工书写这些代码,也可以通过在设置数据源向导里单击“高级”按钮,选择“自动生成INSERT, UPDATE和DELETE命令”,自动的生成语句。

  在“高级SQL生成选项”对话框里有个“使用开放式并发”选项(见图1)。当
选择该项后,数据库中的数据在自上一次成功保存以来没发生任何改变的情况下,才能成功地执行更新或删除操作。

http://files.weikejianghu.com/file_images/article/201605/201605160915581.gif
图1:在“高级SQL生成选项”对话框添加开放式并发支持

  在实现开放式并发教程路我们探讨了开放式并发控制的基本原理以及如何对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展示了这些连续的事件

http://files.weikejianghu.com/file_images/article/201605/201605160915592.gif
图2:当两个用户同时更新一条记录,则存在一个用户的更改覆盖另一个的更改的可能性

  为了应对这种可能性,我们必须执行某种并发控制。本文的焦点——开放式并发控制便是其中之一,它适合于这种情况:假定并发冲突只是偶尔发生,绝大多数的时候并不会出现。 当发生一个冲突时,仅仅简单的告知用户,他所作的更改不能保存,因为别的用户已经修改了同一条记录。

  注意:对应用程序来说,假定并发冲突经常发生,且无法容忍。在这种情况下最后用保守式并发控制。关于保守式并发控制的更多讨论,请参考Implementing Optimistic Concurrency 教程。


  开放式并发控制的作用在于:确保要更新或删除的记录的值与该记录在updating or deleting阶段的值相同。比如,例如,当在一个可编辑的GridView里点击编辑按钮时,该记录的原始值从数据库中读取出来并显示在TextBox和其他Web控件中。这些原始的值保存在GridView里。随后,当用户完成他的修改并点击更新按钮,这些原始值加上修改后的新值发送到业务逻辑层,然后到数据访问层。数据访问层必定发出一个SQL语句,它将仅仅更新那些开始编辑时的原始值根数据库中的值一致的记录。图3描述了这些事件发生的顺序。

http://files.weikejianghu.com/file_images/article/201605/201605160915593.gif
图3:为了更新或删除能够成功,原始值必须与数据库中相应的值一致

  有多种方法可以实现开放式并发控制(查看Peter A. Bromberg的文章  Optmistic Concurrency Updating Logic,从摘要中看到许多选择)。SqlDataSource控件使用该方法(就像数据访问层中ADO.NET类型的数据集使用的那样)扩展WHERE字句,用以包含用来做比较的原始值。例如下面的UPDATE语句,当当前数据库中的值与GridView中开始编辑的原始值一致才更新某个产品的名称和价格。@ProductName 和 @UnitPrice参数包含的是用户输入的新值,而参数@original_ProductName 和 @original_UnitPrice则包含最初点击编辑按钮时加载到GridView中的值:

UPDATE Products SET
 ProductName = @ProductName,
 UnitPrice = @UnitPrice
WHERE
 ProductID = @original_ProductID AND
 ProductName = @original_ProductName AND
 UnitPrice = @original_UnitPrice
</div>

  就像我们将在本教程看到的一样,使SqlDataSource能实现开放式并发控制是很简单的事情。

第一步:创建一个支持开放式并发的SqlDataSource控件

  打开SqlDataSource文件夹中的OptimisticConcurrency.aspx页面,从工具箱拖一个SqlDataSource控件到页面,设置其ID为ProductsDataSourceWithOptimisticConcurrency。在其智能标签里点“设置数据源”,数据库选为“NORTHWINDConnectionString”,点下一步。

http://files.weikejianghu.com/file_images/article/201605/201605160915594.gif
图4:选“ORTHWINDConnectionString”数据库

  在此例子里,我们将添加一个GridView控件以编辑表Products。所以在“Configure the Select Statement”界面选择从表Products返回ProductID, ProductName, UnitPrice和Discontinued列,如图5所示:

http://files.weikejianghu.com/file_images/article/201605/201605160915595.gif
图5:从表Products返回ProductID, ProductName, UnitPrice和Discontinued列

  然后,点“高级”按钮,打开“Advanced SQL Generation Options”对话框,选择“Generate INSERT, UPDATE, and DELETE statements”和“Use optimistic concurrency”2项,点“OK”(见图1)。再点下一步、完成,结束设置。

  完成设置数据源向导后,花几分钟查看DeleteCommand和UpdateCommand属性,以及DeleteParameters和UpdateParameters标签。最快的方法是切换到“源模式”直接在页面代码查看,你会看到UpdateCommand的值像这样:

UPDATE [Products] SET
 [ProductName] = @ProductName,
 [UnitPrice] = @UnitPrice,
 [Discontinued] = @Discontinued
WHERE
 [ProductID] = @original_ProductID AND
 [ProductName] = @original_ProductName AND
 [UnitPrice] = @original_UnitPrice AND
 [Discontinued] = @original_Discontinued
</div>

同时在<UpdateParameters>标签里有7个参数:

<asp:SqlDataSource ID="ProductsDataSourceWithOptimisticConcurrency"
 runat="server" ...>
 <DeleteParameters>
 ...
 </DeleteParameters>
 <UpdateParameters>
 <asp:Parameter Name="ProductName" Type="String" />
 <asp:Parameter Name="UnitPrice" Type="Decimal" />
 <asp:Parameter Name="Discontinued" Type="Boolean" />
 <asp:Parameter Name="original_ProductID" Type="Int32" />
 <asp:Parameter Name="original_ProductName" Type="String" />
 <asp:Parameter Name="original_UnitPrice" Type="Decimal" />
 <asp:Parameter Name="original_Discontinued" Type="Boolean" />
 </UpdateParameters>
 ...
</asp:SqlDataSource>

</div>

同样的,DeleteCommand属性和<DeleteParameters>标签如下:

DELETE FROM [Products]
WHERE
 [ProductID] = @original_ProductID AND
 [ProductName] = @original_ProductName AND
 [UnitPrice] = @original_UnitPrice AND
 [Discontinued] = @original_Discontinued
</div>
<asp:SqlDataSource ID="ProductsDataSourceWithOptimisticConcurrency"
 runat="server" ...>
 <DeleteParameters>
 <asp:Parameter Name="original_ProductID" Type="Int32" />
 <asp:Parameter Name="original_ProductName" Type="String" />
 <asp:Parameter Name="original_UnitPrice" Type="Decimal" />
 <asp:Parameter Name="original_Discontinued" 



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2018-08-20asp.net 利用NPOI导出Excel通用类的方法
  • 2017-05-11IIS处理Asp.net请求和Asp.net页面生命周期说明
  • 2017-05-11检测含有中文字符串的实际长度
  • 2017-05-11不可忽视的 .NET 应用5大性能问题
  • 2017-05-11ASP.NET程序发布详细过程
  • 2017-05-11CHECKBOX 的全选、取消及跨页保存的实现方法
  • 2017-05-11ASP.NET在IE10中无法判断用户已登入及Session丢失问题解决方法
  • 2017-05-11Repeater控件数据导出Excel(附演示动画)
  • 2017-05-11asp.net gridview 72般绝技第1/2页
  • 2017-05-11Repeater中嵌套Repeater的示例介绍

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • ASP.NET MVC中设置跨域访问问题
    • 剖析Asp.Net路由系统实现原理
    • 解决iis7.5服务器上.net 获取不到https页面的信息
    • .NET中TextBox控件设置ReadOnly=true后台取不到值三种解决方法
    • ASP.NET服务器控件的生命周期分析
    • .NET开发基础:从简单的例子理解泛型 分享
    • asp.net 取消缓存相关问题说明
    • asp.net(文章截取前几行作为列表摘要)无损返回HTML代码
    • .net/c# memcached缓存获取所有缓存键的方法步骤
    • .NET Framework 4.5新特性介绍

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有