38处理BLL和DAL的异常.docx

上传人:b****7 文档编号:26127322 上传时间:2023-06-17 格式:DOCX 页数:10 大小:204.62KB
下载 相关 举报
38处理BLL和DAL的异常.docx_第1页
第1页 / 共10页
38处理BLL和DAL的异常.docx_第2页
第2页 / 共10页
38处理BLL和DAL的异常.docx_第3页
第3页 / 共10页
38处理BLL和DAL的异常.docx_第4页
第4页 / 共10页
38处理BLL和DAL的异常.docx_第5页
第5页 / 共10页
点击查看更多>>
下载资源
资源描述

38处理BLL和DAL的异常.docx

《38处理BLL和DAL的异常.docx》由会员分享,可在线阅读,更多相关《38处理BLL和DAL的异常.docx(10页珍藏版)》请在冰豆网上搜索。

38处理BLL和DAL的异常.docx

38处理BLL和DAL的异常

导言

在综叙:

在DataList里编辑和删除数据里,我们创建了一个提供简单编辑和删除功能的DataList。

虽然功能上已经完整了,但是对用户来说是不友好的。

因为所有在编辑和删除过程中产生的异常都是未处理的。

比如,遗漏了输入product的name,或者编辑product时在price里输入“Veryaffordable!

”,都会抛出异常。

而由于在代码里未捕捉这些异常,页面会显示ASP.NET运行时的详细错误信息。

如我们在在ASP.NET页面中处理BLL/DAL层的异常里看到的,如果BLL或DAL里发生异常,详细的信息会返回到ObjectDataSource,然后再到GridView。

我们已经学习了如何优雅的处理这些异常:

为ObjectDataSource或GridView创建Updated或RowUpdated事件处理,检查异常,然后指明异常被处理。

然而在使用DataList时,我们并没有通过ObjectDataSource来更新和删除数据。

我们是直接通过BLL来实现的。

为了检测到BLL或DAL的异常,我们需要在ASP.NET页里写异常处理代码。

本章我们将学习在使用DataList编辑时如何巧妙的处理异常。

注意:

在综叙:

在DataList里编辑和删除数据里,我们讨论了几种不同的编辑和删除数据的方法,其中一些会涉及到使用ObjectDataSource来编辑和删除。

如果你用这些技术的话,你可以直接通过ObjectDataSource的Updated或Deleted事件处理中处理这些异常。

第一步:

创建一个可编辑的DataList

首先创建一个可编辑的DataList。

打开EditDeleteDataList文件夹下的ErrorHandling.aspx页,添加一个ID为Products的DataList和一个名为ProductsDataSource的ObjectDataSouce。

在SELECT标签下选择ProductsBLL类的GetProducts()方法。

在INSERT,UPDATE和DELETE标签里选择None.

图1:

配置ObjectDataSource

完成ObjectDataSouce后,VisualStudio会自动创建一个ItemTemplate。

用显示每个product的name和price并包含一个Editbutton的ItemTemplate代替它,然后创建一个用TextBox显示name和price,并包含一个Updatebutton和Cancelbutton的EditItemTemplate。

最后将DataList的RepeatColumns属性设为2。

做完这些后,你的声明代码应该和下面的差不多。

检查并确保Edit,Cancel和Updatebutton的CommandName属性

分别被设为“Edit”,“Cancel”,和“Update”。

ASP.NET

            

DataListID="Products"runat="server"DataKeyField="ProductID"

           DataSourceID="ProductsDataSource"RepeatColumns="2">

           

           

           

Labelrunat="server"ID="ProductNameLabel"

           Text='<%#Eval("ProductName")%>'/>

           

           Price:

           

Labelrunat="server"ID="Label1"

           Text='<%#Eval("UnitPrice","{0:

C}")%>'/>

           

           

Buttonrunat="server"id="EditProduct"CommandName="Edit"

           Text="Edit"/>

           

           

           

           

           Productname:

           

TextBoxID="ProductName"runat="server"

           Text='<%#Eval("ProductName")%>'/>

           

           Price:

           

TextBoxID="UnitPrice"runat="server"

           Text='<%#Eval("UnitPrice","{0:

C}")%>'/>

           

           

           

ButtonID="UpdateProduct"runat="server"CommandName="Update"

           Text="Update"/> 

           

ButtonID="CancelUpdate"runat="server"CommandName="Cancel"

           Text="Cancel"/>

           

           

DataList>

           

ObjectDataSourceID="ProductsDataSource"runat="server"

           SelectMethod="GetProducts"TypeName="ProductsBLL"

           OldValuesParameterFormatString="original_{0}">

           

ObjectDataSource>

            

注意:

本章里DataList的viewstate必须开启。

浏览一下页面,见图2。

图2:

每个Product都包含一个EditButton

现在Editbutton只是引起一个postback—还不能将product变成可编辑的。

为了实现编辑功能,我们需要为EditCommand,CancelCommand和UpdateCommand创建事件处理。

EditCommand和CancelCommand事件仅仅只需要更新DataList的EditItemIndex属性,并重新绑定数据到DataList。

C#

            protectedvoidProducts_EditCommand(objectsource,DataListCommandEventArgse)

           {

           //SettheDataList'sEditItemIndexpropertytothe

           //indexoftheDataListItemthatwasclicked

           Products.EditItemIndex=e.Item.ItemIndex;

           //RebindthedatatotheDataList

           Products.DataBind();

           }

           protectedvoidProducts_CancelCommand(objectsource,DataListCommandEventArgse)

           {

           //SettheDataList'sEditItemIndexpropertyto-1

           Products.EditItemIndex=-1;

           //RebindthedatatotheDataList

           Products.DataBind();

           }

            

UpdateCommand事件处理稍微麻烦一点。

它需要从DataKey集合里读取被编辑的product的ProductID,和EditItemTemplate里的TextBox里的product的name和price,然后调用ProductsBLL类的UpdateProduct方法,最后返回到DataList编辑前的状态。

我们在这里使用综叙:

在DataList里编辑和删除数据里的UpdateCommand事件处理代码。

C#

            protectedvoidProducts_UpdateCommand(objectsource,DataListCommandEventArgse)

           {

           //ReadintheProductIDfromtheDataKeyscollection

           intproductID=Convert.ToInt32(Products.DataKeys[e.Item.ItemIndex]);

           //Readintheproductnameandpricevalues

           TextBoxproductName=(TextBox)e.Item.FindControl("ProductName");

           TextBoxunitPrice=(TextBox)e.Item.FindControl("UnitPrice");

           stringproductNameValue=null;

           if(productName.Text.Trim().Length>0)

           productNameValue=productName.Text.Trim();

           decimalunitPriceValue=null;

           if(unitPrice.Text.Trim().Length>0)

           unitPriceValue=Decimal.Parse(unitPrice.Text.Trim(),System.Globalization.NumberStyles.Currency);

           //CalltheProductsBLL'sUpdateProductmethod...

           ProductsBLLproductsAPI=newProductsBLL();

           productsAPI.UpdateProduct(productNameValue,unitPriceValue,productID);

           //ReverttheDataListbacktoitspre-editingstate

           Products.EditItemIndex=-1;

           Products.DataBind();

           }

            

在有非法输入的时候—可能是不正确的price格式,比如“-$5.00”,或者忽略了product的name—就会引起异常。

由于UpdateCommand事件处理还没有处理异常,页面会出现ASP.NET运行时错误。

见图3。

图3:

未处理异常发生时,用户会看到这样的错误页面

第二步:

在UpdateCommandEventHandler里处理异常

更新流程中,异常可能发生在UpdateCommand事件处理,或BLL或DAL里。

比如,如果用户输入了一个“太贵”的价格,UpdateCommand事件处理里的Decimal.Parse会抛出FormatException异常。

如果用户忽略了product的name或者price是一个负数,DAL会抛出异常。

当异常发生时,我们希望显示自己定义的信息。

添加一个ID为ExceptionDetails的Label控件到页面上,通过设置CssClass属性为WarningCSS类来将Text设置为红色,特大,加粗的意大利字体。

这个类在Styles.css文件里定义。

异常发生时,我们只希望这个Label显示一次。

也就是说,在后面postback的时候,Label的警告信息需要隐藏起来。

这个可以通过清除Label的Text属性或者将Visible属性设为False(在Page_Load里)(如我们在在ASP.NET页面中处理BLL/DAL层的异常里做的那样)或者禁用Label的viewstate来实现。

我们这里用后一种方法。

ASP.NET

            

LabelID="ExceptionDetails"EnableViewState="False"CssClass="Warning"

           runat="server"/>

            

异常发生时,我们将异常的信息显示在Label的Text属性上。

由于viewstate被禁用了,后面再postback的话,Text属性会自动的丢失,回到缺省值(空字符串),这样就隐藏了警告信息。

异常发生时将信息显示在页面上,我们需要在UpdateCommand事件处理里添加Try....Catch块。

Try的那部分包含可能抛出异常的代码,Catch部分包含当出现异常时需要执行的代码。

更多的Try..Catch块信息参考ExceptionHandlingFundamentals。

C#

            protectedvoidProducts_UpdateCommand(objectsource,DataListCommandEventArgse)

           {

           //Handleanyexceptionsraisedduringtheeditingprocess

           try

           {

           //ReadintheProductIDfromtheDataKeyscollection

           intproductID=Convert.ToInt32(Products.DataKeys[e.Item.ItemIndex]);

           ...Somecodeomittedforbrevity...

           }

           catch(Exceptionex)

           {

           //TODO:

DisplayinformationabouttheexceptioninExceptionDetails

           }

           }

            

无论Try块里抛出何种类型的异常,Catch块的代码都会执行。

抛出异常的类型—DbException,NoNullAllowedException,ArgumentException等—取决于第一个错误。

如果是数据库级别的问题,会抛出DbException。

如果是UnitPrice,UnitsInStock,UnitsOnOrder,或ReorderLevel字段有非法值,会抛出ArgumentException(我们在ProductsDataTable里已经添加过验证字段值的代码,见创建一个业务逻辑层)

我们可以根据捕捉到的异常的类型来为用户提供更好的帮助。

下面的代码—和在ASP.NET页面中处理BLL/DAL层的异常中基本上一样—提供了这个功能:

C#

            protectedvoidProducts_UpdateCommand(objectsource,DataListCommandEventArgse)

           {

           //Handleanyexceptionsraisedduringtheeditingprocess

           try

           {

           //ReadintheProductIDfromtheDataKeyscollection

           intproductID=Convert.ToInt32(Products.DataKeys[e.Item.ItemIndex]);

           ...Somecodeomittedforbrevity...

           }

           catch(Exceptionex)

           {

           //TODO:

DisplayinformationabouttheexceptioninExceptionDetails

           }

           }

            

最后仅仅只需要调用DisplayExceptionDetails方法。

完成Try..Catch后,用户会看到更有用的错误信息,如图4,5所示。

注意在异常出现时,DataList仍然保持在可编辑的模式下。

这是因为异常发生时,控制流程马上转到Catch块里,忽略了将DataList转到编辑前状态的代码。

图4:

用户忽略了必填字段时的错误信息

图5:

输入非法价格时的错误信息

总结

GridView和ObjectDataSource提供了在更新和删除过程中包含异常信息的事件处理和指明异常是否被处理的属性。

而直接使用BLL的DataList没有这些特性,我们需要亲自处理这些异常。

本章我们学习了如何在DataList的更新过程中在UpdateCommand里添加Try...Catch块来处理异常。

如果有任何异常发生,Catch块里的代码会执行,将错误信息显示在ExceptionDetailsLabel上。

现在,DataList并没有在第一时间阻止异常的发生。

尽管我们知道一个负的price值会产生异常,我们也没有添加阻止用户输入这样的值的功能。

在后面的几章里,我们将学习如何通过在EditItemTemplate里添加验证控件来验证用户的输入从而减少这些异常的发生。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 农学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1