【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.NETDataRow,而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)
 54ExpandedSubBlockStart.gifContractedSubBlock.gif    {
 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"11null-14m, 10nullnullfalse1);}
 catch (ArgumentException ae) { Response.Write("There was a problem: " + ae.Message); }
    一般的验证可以通过dataset设计器来设置,如果验证UnitPrice不能小于零呢,或者其他特殊的要求。
   看一看我们添加了一个新的字段级的验证,注意这种使用Partial类来扩展TableAdapter中的方法(重写BeginInit(),添加EventHandler),
   使得DAL和BLL不清晰

ContractedBlock.gif ExpandedBlockStart.gif ProductsDataTable.ColumnChanging.cs
 public partial class ProductsDataTable
    {
        
public override void BeginInit()
        {
            
this.ColumnChanging += ValidateColumn; //重写 实现绑定event handler
        }

        
void ValidateColumn(object sender, DataColumnChangeEventArgs e)
        {
            
if (e.Column.Equals(this.UnitPriceColumn))
            {
                
if (!Convert.IsDBNull(e.ProposedValue) && (decimal)e.ProposedValue < 0)
                {
                    
throw new ArgumentException("UnitPrice cannot be less than zero""UnitPrice");
                }
            }
            
else if (e.Column.Equals(this.UnitsInStockColumn) ||
                    e.Column.Equals(
this.UnitsOnOrderColumn) ||
                    e.Column.Equals(
this.ReorderLevelColumn))
            {
                
if (!Convert.IsDBNull(e.ProposedValue) && (short)e.ProposedValue < 0)
                {
                    
throw new ArgumentException(string.Format("{0} cannot be less than zero", e.Column.ColumnName), e.Column.ColumnName);
                }
            }
        }

 

   进入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









转载于:https://www.cnblogs.com/DylanWind/archive/2008/11/30/1344269.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值