知识大全 ASP.NET 2.0高级数据处理之冲突检测

Posted 操作

篇首语:锲而舍之,朽木不折;锲而不舍,金石可镂。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 ASP.NET 2.0高级数据处理之冲突检测相关的知识,希望对你有一定的参考价值。

ASP.NET 2.0高级数据处理之冲突检测  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

前面我们提到 数据绑定控件把传递给数据源的值存放在相互独立的Keys Values(新值)和 OldValues字典中 在默认情况下 SqlDataSource和ObjectDataSource会忽略OldValues字段 只使用Keys和Values 这种行为是由数据源的ConflictDetection属性检测的 在默认情况下这个属性的值被设置为OverwriteChanges OverwriteChanges模式意味着 为了更新或删除记录 仅仅匹配主键值 这种操作意味着 记录的更新或删除是不考虑该记录的下层值是否改变过了 在通常情况下 理想的状态是 只有当数据行的值与最初选择的值完全匹配的时候 才让Update或Delete操作成功 在这种理想情况下 如果另外一个用户在你选择某一行和更新该行的之间也更新了这一行 你的更新操作就会失败 通过把ConflictDetection属性设置为CompareAllValues 数据源也支持这种操作 在这种模式下 数据源会把OldValues应用到命令或方法上 它会使用这些值来确保在更新或删除记录之前 更新或删除操作必须与记录的所有值都匹配 你还必须把OldValuesParameterFormatString属性设置为一个有效的 NET框架组件格式化字符串(例如 original_ ) 来指明OldValues和Keys字典中的参数如何重新命名以便与NewValues参数区分开来   下面的代码示例显示了SqlDataSource控件在OverwriteChanges和CompareAllValues模式下使用的典型的SQL命令 ID字段被假定为主键字段 请注意 后面一个命令在WHERE子句中比较数据行的所有原始值 而不是仅仅比较主键 在这种情况下 数据源的OldValuesParameterFormatString需要被设置为 original_ SELECT [ID] [Name] [Address] from [Contacts] OverwriteChangesUPDATE [Contacts] SET [Name] = @Name [Address] = @Address WHERE [ID] = @IDDELETE FROM [Contacts] WHERE [ID] = @ID CompareAllValuesUPDATE [Contacts] SET [Name] = @Name [Address] = @Address WHERE [ID] = @original_ID AND [Name] = @original_Name AND [Address] = @original_AddressDELETE FROM [Contacts] WHERE [ID] = @original_ID AND [Name] = @original_Name AND [Address] = @original_Address  请注意 Insert操作不需要OldValues ConflictDetection只对Update和Delete操作有意义   下面的例子演示了冲突发生时的行为 为了运行这个例子 你必须在两个独立的浏览器窗口中打开例子的两个实例(两次点击 Run Sample ) 接着在两个窗体的同一行上都点击 Edit 按钮 使该行进入编辑模式 在第一个窗口中改变一个值并点击 Update 请注意这个更新是成功的 在第二个窗口中 在该行中输入一个新值并点击 Update 这个更新操作没有成功 因为下层数据行的值已经被第一个更新操作改变过了 这个示例检测了Updated或Deleted事件参数的AffectedRows属性 它为 确认了冲突发生了 <script runat= server >Protected Sub SqlDataSource _Updated(sender As Object e As SqlDataSourceStatusEventArgs) If e AffectedRows = Then  Response Write( Row changed update aborted<br /> ) End IfEnd SubProtected Sub SqlDataSource _Deleted(sender As Object e As SqlDataSourceStatusEventArgs) If e AffectedRows = Then  Response Write( Row changed delete aborted<br /> ) End IfEnd Sub</script>  当Update或Delete使用模板化UI的时候 使用了Bind语法的双向(o way)数据绑定字段的旧值都会被保留 对于Delete来说 这意味着在ItemTemplate中你必须给数据绑定的值使用Bind语法 其目的是为了保留删除操作所需要的旧值 下面的例子演示了这种技术 <asp:GridView ……> <Columns>  <asp:CommandField ShowDeleteButton= True ShowEditButton= True />  <asp:TemplateField HeaderText= ContactID InsertVisible= False SortExpression= ContactID >   <ItemTemplate>    <asp:Label ID= Label runat= server Text= <%# Bind( ContactID ) %> ></asp:Label>   </ItemTemplate>   <EditItemTemplate>    <asp:Label ID= Label runat= server Text= <%# Eval( ContactID ) %> ></asp:Label>   </EditItemTemplate>   </asp:TemplateField>  <asp:TemplateField HeaderText= ContactName SortExpression= ContactName >   <ItemTemplate>    <asp:Label ID= Label runat= server Text= <%# Bind( ContactName ) %> ></asp:Label>   </ItemTemplate>   <EditItemTemplate>    <asp:TextBox ID= TextBox runat= server Text= <%# Bind( ContactName ) %> ></asp:TextBox>   </EditItemTemplate>  </asp:TemplateField> </Columns></asp:GridView>

  你可以温和地处理冲突检测错误 可以通过提示用户下层数据被改变了 向用户显示改变过的值 让用户选择提交或放弃自己的操作 下面的例子演示处理冲突检测的一种可行方法 请注意 DetailsView的RowUpdated事件参数传递了可用于检测用户输入的值的字典 你还可以设置这个事件参数的KeepInEditMode属性 使用户在决定如何处理冲突期间 DetailsView处于编辑模式 这个例子所试验方法与上面一个例子类似 同时打开两个窗口来创建冲突更新

Protected Sub DetailsView _ItemUpdated(ByVal sender As Object ByVal e As System Web UI WebControls DetailsViewUpdatedEventArgs) If e AffectedRows = Then   使DetailsView处于编辑模式并与数据库同步  e KeepInEditMode = True  DetailsView DataBind()    用用户输入的值重新填充DetailsView  Dim t As TextBox  t = DetailsView Rows( ) Cells( ) Controls( )  t Text = e NewValues( OrderDate )  t = DetailsView Rows( ) Cells( ) Controls( )  t Text = e NewValues( ShipCountry )  ErrorPanel Visible = True Else  ErrorPanel Visible = False End IfEnd SubProtected Sub DetailsView _ModeChanging(ByVal sender As Object ByVal e As System Web UI WebControls DetailsViewModeEventArgs) If e CancelingEdit = True AndAlso ErrorPanel Visible = True Then  ErrorPanel Visible = False End IfEnd Sub  使用ObjectDataSource的时候 情况也类似 请注意 由于数据源的ConflictDetection属性被设置为CompareAllValues 数据源将查找一个可接受Contact对象的每个字段的原始值的UpdateContact重载   你还可以同时使用DataObjectTypeName属性和CompareAllValues 在这种情况下 ObjectDataSource查找仅接受两个参数(都是Contact)的UpdateContact重载 第一个参数是存放新值的Contact对象 第二个参数是存放旧值的Contact对象 cha138/Article/program/net/201311/12138

相关参考

知识大全 ASP.NET 2.0高级数据处理之使用参数

ASP.NET2.0高级数据处理之使用参数  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!你可以处理

知识大全 ASP.NET 2.0高级数据处理之处理控件事件

ASP.NET2.0高级数据处理之处理控件事件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!在前面

知识大全 ASP.NET 2.0高级数据处理之主从数据表

ASP.NET2.0高级数据处理之主从数据表  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!在前面的

知识大全 ASP.NET 2.0高级控件之FileUpload控件

ASP.NET2.0高级控件之FileUpload控件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 C#+ASP.NET 2.0 定制复合组件之高级篇

C#+ASP.NET2.0定制复合组件之高级篇  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一

知识大全 ASP.NET 2.0移动开发之列表控件

ASP.NET2.0移动开发之列表控件  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!概述  在很多

知识大全 ASP.NET 2.0服务器控件之验证控件示例

ASP.NET2.0服务器控件之验证控件示例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在上

知识大全 ASP.NET 2.0移动开发之属性重写和模板化

ASP.NET2.0移动开发之属性重写和模板化  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  本

知识大全 C#+ASP.NET 2.0 定制复合组件之基础篇

C#+ASP.NET2.0定制复合组件之基础篇  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  摘

知识大全 探讨ASP.NET 2.0的Web控件改进之概述

探讨ASP.NET2.0的Web控件改进之概述  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!一引言