加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2016-11-24 08:15:37 所属栏目:MsSql教程 来源:站长网
导读:导言: 在前面的教程里,我们考察了如何为SqlDataSource控件添加插入、更新、删除功能。简而言之,就是为其nsertCommand, UpdateCommand和DeleteCommd属性赋以相应的INSERT,UPDATE和DELETESQL语句,并将相应的参数放置在InsertParameters, UpdateParameter

  当第2个浏览器更新记录时,WHERE字句里的原始产品名(即Chai)与当前任意一条记录的产品名不匹配(因为第1个浏览器将Chai改为了Chai Tea)。所以表达式“[ProductName] = @original_ProductName ”返回False,导致更新失败。

  注意:删除的原理于此相同。同时打开2个浏览器,第1个先对某个产品作更改,再在第2个浏览器删除该产品,同样是因为原始值与更新后的值不匹配,删除失败。

  在最终用户(更新失败的那个)看来,他点“更新”按钮后,GridView控件返回“预编辑”状态,但提交的修改丢失了。然而没有任何直观的提醒表明修改失败。当用户的更新因并发冲突失败时,我们最好提醒用户,比如将GridView控件保持在“编辑”状态。下面我们来看如何实现这一点。

第3步:并发冲突的处理

  因为并发冲突拒绝用户的更改,所以当发生并发冲突时最好提示用户。在页面上添加一个Label控件,其ID为ConcurrencyViolationMessage,设置其Text 属性为“You have attempted to update or delete a record that was simultaneously updated by another user. Please review the other user's changes and then redo your update or delete”,设置其CssClass属性为“Warning”,它定义在Styles.css中。最后,把Visible和EnableViewState属性设置为“false” 。这样Label控件将不可见,除非发生了某些回传事件(我们在这些回传事件里指定Label控件的Visible属性为true)

/uploads/allimg/c161121/14OI93V04440-502V7.gif
图8:在页面添加一个Label控件用以显示提醒信息

  执行更新或删除操作时,当GridView的数据源控件完成更新或删除后,才开始执行GridView控件的RowUpdated和RowDeleted事件处理器(event handler)。我们可以在这些事件处理器里计算影响了多少条记录。假如影响了0条记录,亦即操作失败,我们希望将Label控件ConcurrencyViolationMessage显示出来。

为RowUpdated和RowDeleted事件创建处理器,添加如下代码:

protected void Products_RowUpdated(object sender, GridViewUpdatedEventArgs e)
{
 if (e.AffectedRows == 0)
 {
 ConcurrencyViolationMessage.Visible = true;
 e.KeepInEditMode = true;
 // Rebind the data to the GridView to show the latest changes
 Products.DataBind();
 }
}
protected void Products_RowDeleted(object sender, GridViewDeletedEventArgs e)
{
 if (e.AffectedRows == 0)
 ConcurrencyViolationMessage.Visible = true;
}

  在这2个事件处理器中我们都要检验e.AffectedRows 属性,如果为0,设置Label控件ConcurrencyViolationMessage的Visible属性为true。特别的,在RowUpdated事件处理器中,我们通过将GridView控件的KeepInEditMode属性设置为true,使其保持在编辑状态。这样的话,通过GridView的DataBind() 方法,将他人已经成功更新的数据显示在编辑状态。

如图9所示,当发生并发冲突时,显示提示信息

/uploads/allimg/c161121/14OI93V41G0-51c28.gif
图9:当发生并发冲突时,显示提示信息:

总结:

  创建一个应用程序时,当多人同时编辑相同数据的时候,要考虑到并发冲突的问题。在默认情况下,ASP.NET数据Web控件和数据源控件没有采取并发控制。就像我们在本章看到的一样,对SqlDataSource控件使用开放式并发控制还是比较迅速和容易的。通过在UPDATE和DELETE语句里扩展WHERE字句,SqlDataSource能应对绝大部分情况,但就像在“正确处理NULL值”部分探讨的那样,对包含NULL值列的处理有漏洞。

  本章是对SqlDataSource考察的完结篇,接下来的教程继续探讨层次结构以及用bjectDataSource处理数据。

  祝编程快乐!

作者简介

  本系列教程作者 Scott Mitchell,著有六本ASP/ASP.NET方面的书,是4GuysFromRolla.com的创始人,自1998年以来一直应用 微软Web技术。大家可以点击查看全部教程《[翻译]Scott Mitchell 的ASP.NET 2.0数据教程》,希望对大家的学习ASP.NET有所帮助。

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读