【ASP.NET step by step】之二 Create a BLL
上一篇写的有些杂乱,有点事无巨细的感觉。这篇还是简洁为主。
1. BLL将TableAdapter里面的方法进一步包装,例如 ProductsBLL.GetProducts(),
另外各个方法应该有必要的逻辑,比如不同的人有不同的权限,返回的产品列表应该不一样,等等。。。
2. .NET 2.0增加了nullable types,在函数的参数列为 int?x 的形式,表示x可以为空
3. AddProduct方法的特殊之处。
A:
因为ProductsRow是继承于ADO.NET的DataRow,而DataRow没有默认的无参构造函数,为了创建一个ProductsRow的实例,我们必须先创建一个ProductsDataTable的实例,然后调用它的NewProductRow方法
public bool AddProduct(string productName, int? supplierID, int? categoryID, string quantityPerUnit,
52 decimal? unitPrice, short? unitsInStock, short? unitsOnOrder, short? reorderLevel,
53 bool discontinued)
54 {
55 // 新建一个ProductRow实例
56 Northwind.ProductsDataTable products = new Northwind.ProductsDataTable();
57 Northwind.ProductsRow product = products.NewProductsRow();
58
59 product.ProductName = productName;
60 if (supplierID == null) product.SetSupplierIDNull(); else product.SupplierID = supplierID.Value;
B:
由于Visual Studio给我们创建的Strong-typed DataTable并不使用Nullable types,所以,遇到可以是空的参数,要使用SetColumnNameNull()
的方法:
if (supplierID == null)
product.SetSupplierIDNull();
else
product.SupplierID = supplierID.Value;
4. 原来的绑定是这样做的:
1 ProductsTableAdapter productsAdapter = new ProductsTableAdapter();
2 GridView1.DataSource = productsAdapter.GetProducts();
3 GridView1.DataBind();
现在呢;
1 ProductsBLL productLogic = new ProductsBLL();
2 GridView1.DataSource = productLogic.GetProducts();
3 GridView1.DataBind();
5. productLogic.UpdateProduct("Scott's Tea", 1, 1, null, -14m, 10, null, null, false, 1); 更新ProductID为1的产品信息。
try
{ // 这个操作将会失败,因为我们试图使用一个小于0的UnitPrice
productLogic.UpdateProduct("Scott's Tea", 1, 1, null, -14m, 10, null, null, false, 1);}
catch (ArgumentException ae) { Response.Write("There was a problem: " + ae.Message); }
一般的验证可以通过dataset设计器来设置,如果验证UnitPrice不能小于零呢,或者其他特殊的要求。
看一看我们添加了一个新的字段级的验证,注意这种使用Partial类来扩展TableAdapter中的方法(重写BeginInit(),添加EventHandler),
使得DAL和BLL不清晰
进入UpdateProduct方法:
//....
product.ProductName = productName;
if (supplierID == null) product.SetSupplierIDNull(); else product.SupplierID = supplierID.Value;
//...
第一步,设置第一个参数,ProductName,程序进入NorthWind类的嵌入类ProductRow的ProductName这个property的set部分
set { this[this.tableProducts.ProductNameColumn] = value; } //value="Scott's Tea"
第二步,因为更改了column,产生ColumnChanging事件,触发ValidateColumn函数响应,进入ValidateColumn函数内部。
UpdateProduct其他的参数依照依次处理。 直到遇到设置unitprice = -14,
throw new ArgumentException("UnitPrice cannot be less than zero", "UnitPrice");
进入Catch{}, response.wirte()会将异常显示在页面开头部分。
There was a problem: UnitPrice cannot be less than zero Parameter name: UnitPrice
出处:http://www.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。