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

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;
    }

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值