您的位置:首页 > 数据库

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

2006-02-28 11:49 851 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐