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;
}
下面,我以数据的插入为例,说明如何在插入时进行数据验证.如何处理数据库的异常.
先介绍一下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;
}
相关文章推荐
- 对输入数据进行多个异常处理
- 数据库被破坏后,数据是完整的,如何对数据进行还原呢
- SQL中数据库表进行互导时,如何处理标识种子列
- 数据库_MySQL_利用 存储过程 对 数据表 中的 每一条记录 进行业务处理
- 可再发行平台 SDK:CAPICOM ,对数据进行数字签名、对代码签名、验证数字签名、包封保密数据、对数据进行散列处理、加密及解密数据的SDK
- Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库 自定义日志记录功能,按日记录,很方便 C#常量和字段以及各种方法的语法总结 类型,对象,线程栈,托管堆在运行时的关系,以及clr如何调用静态方法,实例方法,和虚方法 asp.net webapi 自定义身份验证
- 如何进行跨数据库的数据操作?
- 如何使用SpringMVC进行异常处理
- 无法验证数据。执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息
- 如何对数据按某列进行分层处理
- 在Spring MVC中,如何处理JSON对象,并对Spring MVC框架中的数据转换与数据格式化进行介绍(SSMchapter12)
- 如何使用JavaScript和正则表达式进行数据验证
- 如何用SPSS对数据进行标准化处理?
- 如何处理数据库中海量数据,以及处理数据库海量数据的经验和技巧
- 一个通过异常处理进行验证的crackme分析
- Repeater如何对数据进行处理
- JAVA异常机制介绍/如何正确的进行JAVA异常处理
- SQL 教程数据库包括:Oracle, Sybase, SQL Server, DB2, Access 等等,您将学到如何使用 SQL 访问和处理数据系统中的数据
- WCF技术剖析之十:调用WCF服务的客户端应该如何进行异常处理(转)
- iOS开发中如何对数据与数据模型进行处理