注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

_

_

 
 
 

日志

 
 

DetailsView中如何进行数据验证,如何处理数据库的异常  

2014-09-22 02:50:52|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

DetailsView中如何进行数据验证,如何处理数据库的异常

分类: ASP 2.0 2006-02-28 11:49 1943人阅读 评论(0) 收藏 举报

数据库objectexceptionnullsqlweb

DetailsView是最常用的数据录入控件,它的好处就不说了。但一般提供的例子都是如何插入修改数据,没有提到如何进行数据的验证。如何控制数据库的异常。我在网上找了一下,很多人都提出了这个问题,但有效的解决方案很少.仔细研究DetailsView的事件,我找到了一个简单而有效的方法.

下面,我以数据的插入为例,说明如何在插入时进行数据验证.如何处理数据库的异常.
先介绍一下web页面的功能和使用的控件:
这是一个联系人维护界面,使用GridView+SqlDataSource控件显示全部联系人,使用DetailsView+SqlDataSource负责数据的插入和修改。其他部分不做详细介绍了,我们的焦点集中在如何进行数据验证,数据库异常处理。
这里涉及到两个事件,在用户按下插入按钮后,其执行顺序如下:
SqlDataSource的Inserted事件,发生在数据库插入操作之后,如果有异常发生,可以从第二个参数e中取得。
DetailsView的ModeChanging事件,发生在DetailsView的Mode改变之前,注意它会发生在数据源SqlDataSource的Inserted事件之后,我们可以利用这点来处理数据异常,发现异常后可以阻止DetailsView改变Mode。它的第二个参数e带有一个Cancel属性,如何将Cancel设置为true,将阻止DetailsView改变Mode。DetailsView的数据和状态都将保持不变。
下面是具体的代码:
??? protected void Page_Load(object sender, EventArgs e)
??? {
。。。。。
??????? //add event handler to deal with sql exception
??????? //发生Inserted事件后,调用数据库异常处理过程
??????? SqlDataSource2.Inserted +=? SQLExceptionHandeler;
??????? //init the error status,
//ViewState["SQLErr"]是一个状态,如果数据校验失败,则设置为1否则设置为0
??????? ViewState["SQLErr"] = "0";
??? }

??? //数据库异常处理
??? protected void SQLExceptionHandeler(object sender, SqlDataSourceStatusEventArgs e)
??? {
//LabelErrorInfo显示错误信息
??????? LabelErrorInfo.Text = string.Empty;
??????? //如果数据库操作引发异常,可以在e.Exception中找到它???
??????? if (e.Exception != null)
??????? {
??????????? if (e.Exception is System.Data.SqlClient.SqlException)
??????????? {
??????????????? System.Data.SqlClient.SqlException ex = (System.Data.SqlClient.SqlException)e.Exception;
??????????????? foreach (System.Data.SqlClient.SqlError sqlerr in ex.Errors)
??????????????? {
??????????????????? int errnum = sqlerr.Number;
??????????????????? if (errnum == (int)SQLErrorNum.SqlErr_DuplicateIndex || errnum == (int)SQLErrorNum.SqlErr_DuplicatePrimaryKey)
??????????????????? {
??????????????????????? LabelErrorInfo.Text = string.Format("The contact name {0} {1} has existed, please contact the administrator or use a different name.", e.Command.Parameters["@FirstName"].Value.ToString(), e.Command.Parameters["@LastName"].Value.ToString());
??????????????????????? e.ExceptionHandled = true;
??????????????????????? ViewState["SQLErr"] = "1";
??????????????????????? return;
??????????????????? }
??????????????? }
??????????? }
???? //不处理其他异常,交给异常处理页面?
??????????? ErrorHandler.ReportError(e.Exception, this);?
??????? }?????
???? }

??? //在DetailsView1改变Mode前,要检查是否通过了数据检验,如果没有通过,将阻止DetailsView改变Mode,DetailsView的数据和状态都将保持不变?
??? protected void DetailsView1_ModeChanging(object sender, DetailsViewModeEventArgs e)
??? {
??????? if (DetailsView1.CurrentMode == DetailsViewMode.Insert && e.NewMode == DetailsViewMode.ReadOnly )
??????? {
??????????? if (!ValidateData())
??????????? {
??????????????? e.Cancel = true;
??????????????? return;
??????????? }
??????? }
??????? if (DetailsView1.CurrentMode == DetailsViewMode.Edit && e.NewMode == DetailsViewMode.ReadOnly)
??????? {
??????????? if (!ValidateData())
??????????? {
??????????????? e.Cancel = true;
??????????????? return;
??????????? }
??????? }
??? }

??? //数据检验
??? private bool ValidateData()
??? {
??????? if (ViewState["SQLErr"].ToString() == "1")
??????? {
??????????? ViewState["SQLErr"] = "0";
??????????? return false;
??????? }
??????? return true;
??? }

  评论这张
 
阅读(167)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017