仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 491|回复: 8
打印 上一主题 下一主题

[学习教程] ASP.NET网站制作之ASP.NET2.0数据操纵之创立营业逻辑层

[复制链接]
再现理想 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:43:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
一个很大的类库。应用程序之所以难以跨平台,在于直接调用了特定平台的接口,而一个巨大的类库,就能极大地减少应用程序对平台的依赖。asp.net|创立|数据<P>  导言

  本教程的第一节所形貌的数据会见层(DataAccessLayer,以下简称为DAL)已明晰地将暗示逻辑与数据会见逻辑辨别开了。不外,即便DAL将数据会见的细节从暗示层平分离出来了,可它却不克不及处置任何的营业划定规矩。好比说,我们大概不但愿产物表中那些被标志为“停用”的产物的“分类编号”或“供给商编号”被更新;我们还大概必要使用一些资格划定规矩,好比说我们都不但愿被比本人的资格还要浅的人办理。别的一个对照罕见的情形就是受权,好比说只要那些具有特别权限的用户能够删除产物或是变动单价。

  我们实在能够将营业逻辑层(BusinessLogicLayer,以下简称BLL)看做是在数据会见层和暗示层之间举行数据互换的桥梁,在这个章节中,我们将会商一下怎样将这些营业划定规矩集成到一个BLL中。必要申明的是,在一个实践的使用程序中,BLL都是以类库(ClassLibrary)的情势来完成的,不外为了简化工程的布局,在本教程中我们将BLL完成为App_Code文件夹中的一系列的类。图一直我们展现了暗示层、BLL和DAL三者之间的布局干系。



图一:BLL将暗示层与DAL离隔了,而且到场了营业划定规矩


  第一步:创立BLL类

  我们的BLL由4个类构成,每个BLL类都对应DAL中的一个TableAdapter,它们都从各自的TableAdapter中失掉读取、拔出、修正和删除等办法以使用符合的营业划定规矩。

  为了加倍明晰的辨别DAL和BLL的类,我们在App_Code文件夹中创建两个子文件夹,分离定名为DAL和BLL。你仅仅必要在办理计划扫瞄器(SolutionExplorer)中右键点击App_Code文件夹,并选择新建文件夹(NewFolder),就能够创立新的子文件夹了。建好了这两个文件夹以后,把第一节中所创立的范例化数据集(TypedDataSet)移到DAL文件夹中。

  然后,在BLL文件夹中创立4个类文件。一样,你仅仅必要在办理计划扫瞄器(SolutionExplorer)中右键点击BLL文件夹,并选择新建项目(NewItem),然后在弹出的对话框当选择类模板(Classtemplate)就能够创立新的类文件了。将这四个文件分离定名为ProductsBLL、CategoriesBLL、SuppliersBLL和EmployeesBLL。



图二:在BLL文件夹中增加4个新的类


  接上去,让我们来给这些新建的类加上一些办法,复杂的将第一节中的TableAdapter中的那些办法包装起来就好了。如今,这些办法将只能间接利用DAL中的那些办法,我们等会再来给他们加上一些营业逻辑。

  注重:假如你利用的是VisualStudio尺度版或以上版本(也就是说,你不是用的VisualWebDeveloper),那末你还可使用ClassDesigner来可视化的计划你的类。你能够在ClassDesignerBlog上失掉关于VisualStudio的这项新功效的具体信息。

  在ProductsBLL类中,我们一共必要为其增加7个办法:

  ・GetProducts()C前往一切的产物

  ・GetProductByProductID(productID)C前往指定ProductID的产物

  ・GetProductsByCategoryID(categoryID)C前往指定分类的产物

  ・GetProductsBySupplier(supplierID)C前往指定供给商的产物

  ・AddProduct(productName,supplierID,categoryID,quantityPerUnit,unitPrice,unitsInStock,unitsOnOrder,reorderLevel,discontinued)C向数据库中增加一条产物信息,并前往新增加的产物的ProductID

  ・UpdateProduct(productName,supplierID,categoryID,quantityPerUnit,unitPrice,unitsInStock,unitsOnOrder,reorderLevel,discontinued,productID)C更新一个数据库中已存在的产物,假如恰好更新了一笔记录,则前往true,不然前往false

  ・DeleteProduct(productID)C删除指定ProductID的产物

  ProductsBLL.cs

1usingSystem;
2usingSystem.Data;
3usingSystem.Configuration;
4usingSystem.Web;
5usingSystem.Web.Security;
6usingSystem.Web.UI;
7usingSystem.Web.UI.WebControls;
8usingSystem.Web.UI.WebControls.WebParts;
9usingSystem.Web.UI.HtmlControls;
10usingNorthwindTableAdapters;
11
12[System.ComponentModel.DataObject]
13publicclassProductsBLL
14{
15privateProductsTableAdapter_productsAdapter=null;
16protectedProductsTableAdapterAdapter
17{
18get{
19if(_productsAdapter==null)
20_productsAdapter=newProductsTableAdapter();
21
22return_productsAdapter;
23}
24}
25
26
27[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select,true)]
28publicNorthwind.ProductsDataTableGetProducts()
29{
30returnAdapter.GetProducts();
31}
32
33[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select,false)]
34publicNorthwind.ProductsDataTableGetProductByProductID(intproductID)
35{
36returnAdapter.GetProductByProductID(productID);
37}
38
39[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select,false)]
40publicNorthwind.ProductsDataTableGetProductsByCategoryID(intcategoryID)
41{
42returnAdapter.GetProductsByCategoryID(categoryID);
43}
44
45[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select,false)]
46publicNorthwind.ProductsDataTableGetProductsBySupplierID(intsupplierID)
47{
48returnAdapter.GetProductsBySupplierID(supplierID);
49}
50[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Insert,true)]
51publicboolAddProduct(stringproductName,int?supplierID,int?categoryID,stringquantityPerUnit,
52decimal?unitPrice,short?unitsInStock,short?unitsOnOrder,short?reorderLevel,
53booldiscontinued)
54{
55//新建一个ProductRow实例
56Northwind.ProductsDataTableproducts=newNorthwind.ProductsDataTable();
57Northwind.ProductsRowproduct=products.NewProductsRow();
58
59product.ProductName=productName;
60if(supplierID==null)product.SetSupplierIDNull();elseproduct.SupplierID=supplierID.Value;
61if(categoryID==null)product.SetCategoryIDNull();elseproduct.CategoryID=categoryID.Value;
62if(quantityPerUnit==null)product.SetQuantityPerUnitNull();elseproduct.QuantityPerUnit=quantityPerUnit;
63if(unitPrice==null)product.SetUnitPriceNull();elseproduct.UnitPrice=unitPrice.Value;
64if(unitsInStock==null)product.SetUnitsInStockNull();elseproduct.UnitsInStock=unitsInStock.Value;
65if(unitsOnOrder==null)product.SetUnitsOnOrderNull();elseproduct.UnitsOnOrder=unitsOnOrder.Value;
66if(reorderLevel==null)product.SetReorderLevelNull();elseproduct.ReorderLevel=reorderLevel.Value;
67product.Discontinued=discontinued;
68
69//增加新产物
70products.AddProductsRow(product);
71introwsAffected=Adapter.Update(products);
72
73//假如恰好新增了一笔记录,则前往true,不然前往false
74returnrowsAffected==1;
75}
76
77[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Update,true)]
78publicboolUpdateProduct(stringproductName,int?supplierID,int?categoryID,stringquantityPerUnit,
79decimal?unitPrice,short?unitsInStock,short?unitsOnOrder,short?reorderLevel,
80booldiscontinued,intproductID)
81{
82Northwind.ProductsDataTableproducts=Adapter.GetProductByProductID(productID);
83if(products.Count==0)
84//没有找到婚配的纪录,前往false
85returnfalse;
86
87Northwind.ProductsRowproduct=products[0];
88
89product.ProductName=productName;
90if(supplierID==null)product.SetSupplierIDNull();elseproduct.SupplierID=supplierID.Value;
91if(categoryID==null)product.SetCategoryIDNull();elseproduct.CategoryID=categoryID.Value;
92if(quantityPerUnit==null)product.SetQuantityPerUnitNull();elseproduct.QuantityPerUnit=quantityPerUnit;
93if(unitPrice==null)product.SetUnitPriceNull();elseproduct.UnitPrice=unitPrice.Value;
94if(unitsInStock==null)product.SetUnitsInStockNull();elseproduct.UnitsInStock=unitsInStock.Value;
95if(unitsOnOrder==null)product.SetUnitsOnOrderNull();elseproduct.UnitsOnOrder=unitsOnOrder.Value;
96if(reorderLevel==null)product.SetReorderLevelNull();elseproduct.ReorderLevel=reorderLevel.Value;
97product.Discontinued=discontinued;
98
99//更新产物纪录
100introwsAffected=Adapter.Update(product);
101
102//假如恰好更新了一笔记录,则前往true,不然前往false
103returnrowsAffected==1;
104}
105
106[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Delete,true)]
107publicboolDeleteProduct(intproductID)
108{
109introwsAffected=Adapter.Delete(productID);
110
111//假如恰好删除一笔记录,则前往true,不然前往false
112returnrowsAffected==1;
113}
114}
115
  GetProducts、GetProductByProductID、GetProductsByCategoryID和GetProductBySuppliersID等办法都仅仅是简复杂单的间接挪用DAL中的办法来前往数据。不外在有的情形下,我们还大概必要给它们完成一些营业划定规矩(好比说受权划定规矩,分歧的用户或不必脚色应当能够看到分歧的数据),如今我们复杂的将它们做成如许就能够了。那末,关于这些办法来讲,BLL仅仅是作为暗示层与DAL之间的代办署理。

  AddProduct和UpdateProduct这两个办法都利用参数中的那些产物信息往增加或是更新一条产物纪录。因为Product表中有很多字段都同意空值(CategoryID、SupplierID、UnitPrice……等等),以是AddProduct和UpdateProduct中响应的参数就利用nullabletypes。Nullabletypes是.NET2.0中新供应的一种用于标明一个值范例是不是能够为空的手艺。在C#中,你能够在一个同意为空的值范例前面加上一个问号(好比,intx;)。关于NullableTypes的具体信息,你能够参考C#ProgrammingGuide。

  因为拔出、修正和删除大概不会影响任何行,以是这三种办法均前往一个bool值用于暗示操纵是不是乐成。好比说,页面开辟职员利用一个其实不存在的ProductID往挪用DeleteProduct,很明显,提交给数据库的DELETE语句将不会有任何感化,以是DeleteProduct会前往false。

  注重:当我们在增加或更新一个产物的具体信息时,都是承受由产物信息构成的一个标量列表,而不是间接承受一个ProductsRow实例。由于ProductsRow是承继于ADO.NET的DataRow,而DataRow没有默许的无参机关函数,为了创立一个ProductsRow的实例,我们必需先创立一个ProductsDataTable的实例,然后挪用它的NewProductRow办法(就像我们在AddProduct办法中所做的那样)。不外,当我在利用ObjectDataSource来拔出或更新时,如许做的弱点就会表露出来了。复杂的讲,ObjectDataSource会试图为输出的参数创立一个实例,假如BLL办法但愿失掉一个ProductsRow,那末ObjectDataSource就将会试图往创立一个,不外很明显,如许的操纵必定会失利,由于没有一个默许的无参机关函数。这个成绩的具体信息,能够在ASP.NET论坛的以下两个帖子中找到:UpdatingObjectDataSourceswithStrongly-TypedDataSets、ProblemWithObjectDataSourceandStrongly-TypedDataSet。

  以后,在AddProduct和UpdateProduct中,我们创立了一个ProductsRow实例,并将传进的参数赋值给它。当给一个DataRow的DataColumns赋值时,各类字段级的无效性考证都有大概会被触发。因而,我们应当手工的考证一下传进的参数以包管传送给BLL办法的数据是无效的。不幸的是,VisualStudio天生的强范例数据集(strongly-typedDataRow)并没有利用nullablevalues。要标明DataRow中的一个DataColumn能够承受空值,我们就必需得利用SetColumnNameNull办法。

  在UpdateProduct中,我们先利用GetProductByProductID(productID)办法将必要更新的产物信息读掏出来。如许做仿佛没有甚么需要,不外我们将在以后的关于并发优化(Optimisticconcurrency)的课程中证实这个分外的操纵是有它的感化的。并发优化是一种包管两个用户同时操纵一个数据而不会产生抵触的手艺。猎取整笔记录同时也能够使创立一个仅更新DataRow的一部排列的办法加倍简单,我们能够在SuppliersBLL类中找到如许的例子。

  最初,注重我们在ProductsBLL类下面加上了DataObject标签(就是在类声明语句的下面的[System.ComponentModel.DataObject]),各办法下面另有DataObjectMethodAttribute标签。DataObject标签把这个类标志为能够绑定到一个ObjectDataSource控件,而DataObjectMethodAttribute则申明了这个办法的目标。我们将在前面的教程中看到,ASP.NET2.0的ObjectDataSource使从一个类中会见数据加倍简单。为了ObjectDataSource导游可以对现有的类举行符合的选择,在类列表中默许仅显现标志为DataObject的类。固然,实在ProductsBLL类就算没有这个标签也能够事情,可是加上它可使我们在ObjectDataSource导游中的操纵加倍轻松和心境兴奋。
<P>  增加其他的类

  完成了ProductsBLL类以后,我们还要增加一些为categories、suppliers和employees服务的类。让我们花点工夫来创立上面的类,依据下面的例子来做就是了:

  ・CategoriesBLL.cs

   oGetCategories()

   oGetCategoryByCategoryID(categoryID)

  ・SuppliersBLL.cs

   oGetSuppliers()

   oGetSupplierBySupplierID(supplierID)

   oGetSuppliersByCountry(country)

   oUpdateSupplierAddress(supplierID,address,city,country)

  ・EmployeesBLL.cs

   oGetEmployees()

   oGetEmployeeByEmployeeID(employeeID)

   oGetEmployeesByManager(managerID)

  SuppliersBLL类中的UpdateSupplierAddress办法是一个值得注重的器材。这个办法供应了一个仅仅更新供给商地点信息的接口。它起首依据指定的SupplierID读出一个SupplierDataRow(利用GetSupplierBySupplierID办法),设置其关于地点的一切属性,然后挪用SupplierDataTable的Update办法。UpdateSupplierAddress办法的代码以下所示:

  UpdateSupplierAddress

1[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Update,true)]
2publicboolUpdateSupplierAddress(intsupplierID,stringaddress,stringcity,stringcountry)
3{
4Northwind.SuppliersDataTablesuppliers=Adapter.GetSupplierBySupplierID(supplierID);
5if(suppliers.Count==0)
6//没有找到婚配的项,前往false
7returnfalse;
8else
9{
10Northwind.SuppliersRowsupplier=suppliers[0];
11
12if(address==null)supplier.SetAddressNull();elsesupplier.Address=address;
13if(city==null)supplier.SetCityNull();elsesupplier.City=city;
14if(country==null)supplier.SetCountryNull();elsesupplier.Country=country;
15
16//更新供给商的关于地点的信息
17introwsAffected=Adapter.Update(supplier);
18
19//假如恰好更新了一笔记录,则前往true,不然前往false
20returnrowsAffected==1;
21}
22}
23
  能够从页面顶部的链接处下载BLL类的完全代码。

  第二步:经由过程BLL类会见范例化数据集

  在本教程的第一节中,我们给出了间接利用范例化数据集的例子,不外在我们增加了BLL类以后,暗示层就能够经由过程BLL来事情了。在本教程的第一节中的AllProducts.aspx的例子中,ProductsTableAdapter用于将产物列表绑定到GridView上,代码以下所示:

1ProductsTableAdapterproductsAdapter=newProductsTableAdapter();
2GridView1.DataSource=productsAdapter.GetProducts();
3GridView1.DataBind();
  要利用新的BLL类,我们所必要做的仅仅是复杂的修正一下第一行代码。用ProductBLL工具来取代ProductsTableAdapter便可:

1ProductsBLLproductLogic=newProductsBLL();
2GridView1.DataSource=productLogic.GetProducts();
3GridView1.DataBind();
  BLL类也能够经由过程利用ObjectDataSource来明晰了然的会见(就像范例化数据集一样)。我们将在接上去的教程中具体的会商ObjectDataSource。



图三:GridView中显现的产物列表


  第三步:给DataRow增加字段级考证

  字段级考证是指在拔出或更新时反省营业工具所触及到的一切属性值。拿产物来举个例,某些字段级的考证划定规矩以下所示:

  ・ProductName字段不得凌驾40个字符

  ・QuantityPerUnit字段不得凌驾20个字符

  ・ProductID、ProductName和Discontinued字段是必填的,而其他字段则是可填可不填的

  ・UnitPrice、UnitsInStock、UnitsOnOrder和ReorderLevel字段不得小于0

  这些划定规矩能够大概说是应当在数据库层被形貌出来。ProductName和QuantityPerUnit字段上的字符数限定能够经由过程Products表中响应列的数据范例来完成(分离为nvarchar(40)andnvarchar(20))。字段“是不是必填”能够经由过程将数据库中表的响应列设置为“同意为NULL”来完成。为了包管UnitPrice、UnitsInStock、UnitsOnOrder和ReorderLevel字段的值不小于0,能够分离在它们的响应列上加一个束缚。

  除在数据库中使用了这些划定规矩以外,它们同时也将被其使用在DataSet上。现实上,字段长度和是不是同意为空等信息已被使用到了各DataTable的DataColumn汇合中。我们能够在数据集计划器(DataSetDesigner)中看到已存在的字段级考证,从某个DataTable当选择一个字段,然后在属性窗口中就能够找到了。如图四所示,ProductDataTable中的QuantityPerUnit字段同意空值而且最年夜长度为20各字符。假如我们试图给某个ProductsDataRow的QuantityPerUnit属性设置一个长度年夜于20个字符的字符串,将会有一个ArgumentException被抛出。



图四:DataColumn供应了基础的字段级考证


  不幸的是,我们不克不及经由过程属性窗口指定一个界限反省,好比UnitPrice的值不克不及小于0。为了供应如许的字段级考证,我们必要为DataTable的ColumnChanging事务创建一个EventHandler。正如上一节教程中所提到的那样,由范例化数据集创立的DataSet、DataTable另有DataRow工具能够经由过程partial类来举行扩大。利用这个手艺,我们能够为ProductDataTable创立一个ColumnChanging的EventHandler。我们先在App_Code文件夹中新建一个名为ProductsDataTable.ColumnChanging.cs的类文件,以下图所示。



图五:在App_Code文件夹中增加新类


  然后,给ColumnChanging事务创立一个Eventhandler,以包管UnitPrice、UnitsInStock、UnitsOnOrder和ReorderLevel字段的值不小于0。假如这些列的值超越局限就抛出一个ArgumentException。

  ProductsDataTable.ColumnChanging.cs

1publicpartialclassNorthwind
2{
3publicpartialclassProductsDataTable
4{
5publicoverridevoidBeginInit()
6{
7this.ColumnChanging+=ValidateColumn;
8}
9
10voidValidateColumn(objectsender,DataColumnChangeEventArgse)
11{
12if(e.Column.Equals(this.UnitPriceColumn))
13{
14if(!Convert.IsDBNull(e.ProposedValue)&&(decimal)e.ProposedValue<0)
15{
16thrownewArgumentException("UnitPricecannotbelessthanzero","UnitPrice");
17}
18}
19elseif(e.Column.Equals(this.UnitsInStockColumn)||
20e.Column.Equals(this.UnitsOnOrderColumn)||
21e.Column.Equals(this.ReorderLevelColumn))
22{
23if(!Convert.IsDBNull(e.ProposedValue)&&(short)e.ProposedValue<0)
24{
25thrownewArgumentException(string.Format("{0}cannotbelessthanzero",e.Column.ColumnName),e.Column.ColumnName);
26}
27}
28}
29}
30}
  第四步:给BLL类增加营业划定规矩

  除字段级的考证,大概另有一些不克不及在单个列中暗示的包括分歧实体或观点的更初级的营业划定规矩,好比:

  ・假如一个产物被标志为“停用”,那末它的单价就不克不及被修正

  ・一个雇员的寓居地必需与他(她)的主管的寓居地不异

  ・假如某个产物是某供给商独一供应的产物,那末这个产物就不克不及被标志为“停用”

  BLL类应当包管一直都考证使用程序的营业划定规矩。这些考证能够间接的增加到使用他们的办法中。

  设想一下,我们的营业划定规矩标明了假如一个产物是给定的供给商的独一产物,那末它就不克不及被标志为“停用”。也就是说,假如产物X是我们从供给商Y处购置的独一一个产物,那末我们就不克不及将X标志为停用;但是,假如供给商Y供应给我们的一共有3样产物,分离是A、B和C,那末我们能够将个中任何一个大概三个全体都标志为“停用”。挺奇异的营业划定规矩,是吧?可是贸易上的划定规矩一般就是跟我们寻常的感到不太一样。

  要在UpdateProducts办法中使用这个营业划定规矩,那末我们就应当先反省Discontinued是不是被设置为true。假设是如许的话,那末我们应当先挪用GetProductsBySupplierID来看看我们从这个供给商处一共购置了几产物。假如我们仅仅从这个供给商处购置了这一个产物,那末我们就抛出一个ApplicationException。

  UpdateProduct

1publicboolUpdateProduct(stringproductName,int?supplierID,int?categoryID,stringquantityPerUnit,
2decimalunitPrice,short?unitsInStock,short?unitsOnOrder,short?reorderLevel,
3booldiscontinued,intproductID)
4{
5Northwind.ProductsDataTableproducts=Adapter.GetProductByProductID(productID);
6if(products.Count==0)
7//没有找到婚配项,前往false
8returnfalse;
9
10Northwind.ProductsRowproduct=products[0];
11
12//营业划定规矩反省C不克不及停用某供给商所供应的独一一个产物
13if(discontinued)
14{
15//猎取我们从这个供给商处取得的一切产物
16Northwind.ProductsDataTableproductsBySupplier=Adapter.GetProductsBySupplierID(product.SupplierID);
17
18if(productsBySupplier.Count==1)
19//这是我们从这个供给商处取得的独一一个产物
20thrownewApplicationException("Youcannotmarkaproductasdiscontinuedifitstheonlyproductpurchasedfromasupplier");
21}
22
23product.ProductName=productName;
24if(supplierID==null)product.SetSupplierIDNull();elseproduct.SupplierID=supplierID.Value;
25if(categoryID==null)product.SetCategoryIDNull();elseproduct.CategoryID=categoryID.Value;
26if(quantityPerUnit==null)product.SetQuantityPerUnitNull();elseproduct.QuantityPerUnit=quantityPerUnit;
27if(unitPrice==null)product.SetUnitPriceNull();elseproduct.UnitPrice=unitPrice.Value;
28if(unitsInStock==null)product.SetUnitsInStockNull();elseproduct.UnitsInStock=unitsInStock.Value;
29if(unitsOnOrder==null)product.SetUnitsOnOrderNull();elseproduct.UnitsOnOrder=unitsOnOrder.Value;
30if(reorderLevel==null)product.SetReorderLevelNull();elseproduct.ReorderLevel=reorderLevel.Value;
31product.Discontinued=discontinued;
32
33//更新产物纪录
34introwsAffected=Adapter.Update(product);
35
36//假如恰好更新了一笔记录,则前往true,不然前往false
37returnrowsAffected==1;
38}
39
  在暗示层中呼应考证毛病

  当我们从暗示层中挪用BLL时,我们能够决意是不是要处置某个大概会被抛出的非常大概让它间接抛给ASP.NET(如许将会激发HttpApplication的堕落事务)。在利用BLL的时分,假如要以编程的体例处置一个非常,我们可使用try...catch块,就像上面的示例一样:

1ProductsBLLproductLogic=newProductsBLL();
2
3//更新ProductID为1的产物信息
4try
5{
6//这个操纵将会失利,由于我们试图利用一个小于0的UnitPrice
7productLogic.UpdateProduct("ScottsTea",1,1,null,-14m,10,null,null,false,1);
8}
9catch(ArgumentExceptionae)
10{
11Response.Write("Therewasaproblem:"+ae.Message);
12}
  我们将在前面的教程中看到,当经由过程一个数据Web控件(dataWebControl)来举行拔出、修正或删除操纵数据时,处置从BLL中抛出的非常能够间接在一个EventHandler中举行,而不必要利用try…catch块来包装代码。

  总结

  一个具有优秀架构的使用程序都具有明晰的条理布局,每个条理都封装了一个特定的脚色。在本教程的第一篇中,我们用范例化数据集创立了一个数据会见层;这一篇中,我们又创建了一个营业逻辑层,它由App_Code中一系列的类组成,并挪用DAL中响应的办法。BLL为我们的使用程序完成了字段级和营业级的逻辑。除创立一个自力的BLL,就像我们在本节中所做的那样,别的一个选择是利用partial类来扩大TableAdapter中的办法。但是,利用这个手艺其实不能使我们能够重写已存在的办法,也不克不及将我们的DAL和BLL分隔得充足明晰。

  完成了DAL和BLL以后,我们就筹办入手下手处置暗示层了。鄙人一个教程中,我们将复杂的先容一些数据会见的主题,并为全部教程界说一个分歧的页面出现。有理由相信是能提供更出色的性能。很多平台无法支持复杂的编译器,因此需要二次编译来减少本地编译器的复杂度。当然可能做不到java编译器那么简易。
不帅 该用户已被删除
沙发
发表于 2015-1-19 21:42:44 | 只看该作者
但是目前在CGI中使用的最为广泛的是Perl语言。所以,狭义上所指的CGI程序一般都是指Perl程序,一般CGI程序的后缀都是.pl或者.cgi。
海妖 该用户已被删除
板凳
发表于 2015-1-25 14:25:05 | 只看该作者
在调试JSP代码时,如果程序出错,JSP服务器会返回出错信息,并在浏览器中显示。这时,由于JSP是先被转换成Servlet后再运行的,所以,浏览器中所显示的代码出错的行数并不是JSP源代码的行数。
蒙在股里 该用户已被删除
地板
发表于 2015-2-2 22:21:32 | 只看该作者
能产生和执行动态、交互式、高效率的站占服务器的应用程序。运用ASP可将VBscript、javascript等脚本语言嵌入到HTML中,便可快速完成网站的应用程序,无需编译,可在服务器端直接执行。容易编写。
admin 该用户已被删除
5#
发表于 2015-2-8 14:14:43 | 只看该作者
同时也感谢博客园给我们这个平台,也感谢博客园的编辑们做成专题引来这么多高人指点。
乐观 该用户已被删除
6#
发表于 2015-2-25 16:55:27 | 只看该作者
能产生和执行动态、交互式、高效率的站占服务器的应用程序。运用ASP可将VBscript、javascript等脚本语言嵌入到HTML中,便可快速完成网站的应用程序,无需编译,可在服务器端直接执行。容易编写。
金色的骷髅 该用户已被删除
7#
发表于 2015-3-7 23:49:22 | 只看该作者
当然我们在选择Asp.net主机是,除了要考虑服务提供商在版本是否是实时更新以外,机房的环境和配置也是非常重要的,通常选择骨干网的机房,在速度和稳定性上会非常有保证。
小妖女 该用户已被删除
8#
发表于 2015-3-15 17:30:08 | 只看该作者
asp.net空间的支持有:ASP.NET1.1/虚拟目录/MicrosoftFrontPage2000扩展/CDONTS,同时他的网站上也提供了Asp.net的使用详解和程序源代码,相信对使用ASP.NET编程的程序员来说会非常有用哦!
冷月葬花魂 该用户已被删除
9#
发表于 2015-3-22 02:11:08 | 只看该作者
可以看作是VC和Java的混合体吧,尽管MS自己讲C#内核中更多的象VC,但实际上我还是认为它和Java更象一些吧。首先它是面向对象的编程语言,而不是一种脚本,所以它具有面向对象编程语言的一切特性。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-9-26 05:15

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表