[System.ComponentModel.DataObject]
public class ProductsBLL
{
    private ProductsTableAdapter _productsAdapter = null;
    protected ProductsTableAdapter Adapter
    {
        get {
            if (_productsAdapter == null)
                _productsAdapter = new ProductsTableAdapter();            return _productsAdapter;
        }
    }
    [System.ComponentModel.DataObjectMethodAttribute
        (System.ComponentModel.DataObjectMethodType.Select, true)]
    public Northwind.ProductsDataTable GetProducts()
    {
        return Adapter.GetProducts();
    }    [System.ComponentModel.DataObjectMethodAttribute
        (System.ComponentModel.DataObjectMethodType.Select, false)]
    public Northwind.ProductsDataTable GetProductByProductID(int productID)
    {
        return Adapter.GetProductByProductID(productID);
    }    [System.ComponentModel.DataObjectMethodAttribute
        (System.ComponentModel.DataObjectMethodType.Select, false)]
    public Northwind.ProductsDataTable GetProductsByCategoryID(int categoryID)
    {
        return Adapter.GetProductsByCategoryID(categoryID);
    }    [System.ComponentModel.DataObjectMethodAttribute
        (System.ComponentModel.DataObjectMethodType.Select, false)]
    public Northwind.ProductsDataTable GetProductsBySupplierID(int supplierID)
    {
        return Adapter.GetProductsBySupplierID(supplierID);
    }
    [System.ComponentModel.DataObjectMethodAttribute
        (System.ComponentModel.DataObjectMethodType.Insert, true)]
    public bool AddProduct(string productName, int? supplierID, int? categoryID,
        string quantityPerUnit, decimal? unitPrice,  short? unitsInStock,    //這些問號是什麽意思?
        short? unitsOnOrder, short? reorderLevel, bool discontinued)
    {
        // Create a new ProductRow instance
        Northwind.ProductsDataTable products = new Northwind.ProductsDataTable();
        Northwind.ProductsRow product = products.NewProductsRow();        product.ProductName = productName;
        if (supplierID == null) product.SetSupplierIDNull();
          else product.SupplierID = supplierID.Value;
        if (categoryID == null) product.SetCategoryIDNull();
          else product.CategoryID = categoryID.Value;
        if (quantityPerUnit == null) product.SetQuantityPerUnitNull();
          else product.QuantityPerUnit = quantityPerUnit;
        if (unitPrice == null) product.SetUnitPriceNull();
          else product.UnitPrice = unitPrice.Value;
        if (unitsInStock == null) product.SetUnitsInStockNull();
          else product.UnitsInStock = unitsInStock.Value;
        if (unitsOnOrder == null) product.SetUnitsOnOrderNull();
          else product.UnitsOnOrder = unitsOnOrder.Value;
        if (reorderLevel == null) product.SetReorderLevelNull();
          else product.ReorderLevel = reorderLevel.Value;
        product.Discontinued = discontinued;        // Add the new product
        products.AddProductsRow(product);
        int rowsAffected = Adapter.Update(products);        // Return true if precisely one row was inserted,
        // otherwise false
        return rowsAffected == 1;
    }    [System.ComponentModel.DataObjectMethodAttribute
        (System.ComponentModel.DataObjectMethodType.Update, true)]
    public bool UpdateProduct(string productName, int? supplierID, int? categoryID,
        string quantityPerUnit, decimal? unitPrice, short? unitsInStock,
        short? unitsOnOrder, short? reorderLevel, bool discontinued, int productID)
    {
        Northwind.ProductsDataTable products = Adapter.GetProductByProductID(productID);
        if (products.Count == 0)
            // no matching record found, return false
            return false;        Northwind.ProductsRow product = products[0];        product.ProductName = productName;
        if (supplierID == null) product.SetSupplierIDNull();
          else product.SupplierID = supplierID.Value;
        if (categoryID == null) product.SetCategoryIDNull();
          else product.CategoryID = categoryID.Value;
        if (quantityPerUnit == null) product.SetQuantityPerUnitNull();
          else product.QuantityPerUnit = quantityPerUnit;
        if (unitPrice == null) product.SetUnitPriceNull();
          else product.UnitPrice = unitPrice.Value;
        if (unitsInStock == null) product.SetUnitsInStockNull();
          else product.UnitsInStock = unitsInStock.Value;
        if (unitsOnOrder == null) product.SetUnitsOnOrderNull();
          else product.UnitsOnOrder = unitsOnOrder.Value;
        if (reorderLevel == null) product.SetReorderLevelNull();
          else product.ReorderLevel = reorderLevel.Value;
        product.Discontinued = discontinued;        // Update the product record
        int rowsAffected = Adapter.Update(product);        // Return true if precisely one row was updated,
        // otherwise false
        return rowsAffected == 1;
    }    [System.ComponentModel.DataObjectMethodAttribute
        (System.ComponentModel.DataObjectMethodType.Delete, true)]
    public bool DeleteProduct(int productID)
    {
        int rowsAffected = Adapter.Delete(productID);        // Return true if precisely one row was deleted,
        // otherwise false
        return rowsAffected == 1;
    }
}上面的那些中括号是什么意思吖?有些什么作用的?初学者,请大家多指点指点!

解决方案 »

  1.   

    [System.ComponentModel.DataObject] 
    指示Visual   Studio把下面的类包含在ObjectDataSource向导的数据对象下拉列表中。
      

  2.   

    解释一下各位对于那些方括号的疑问,那个东西叫做Attribute(中文不知道该翻译成什么比较合适),主要是反射的时候用,本文中的这些Attribute非常的简单,仅仅是告诉反射的用户这个方法是干什么用的,以及是不是默认使用这个方法e.g. 
    [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, true)] 
    public Northwind.ProductsDataTable GetProducts() 

    return Adapter.GetProducts(); 

    其中,System.ComponentModel.DataObjectMethodType.Select说明这是一个用于Select的方法,true说明这是默认的用于Select的方法 所以,相对的 
    [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, false)] 
    public Northwind.ProductsDataTable GetProductByProductID(int productID) 

    return Adapter.GetProductByProductID(productID); 

    就说明这是一个用于Select的方法,但是它不是默认的用于Select的方法 
    需要说明的是,上面所讨论的System.ComponentModel.DataObjectMethodAttribute是针对ProductsBLL而言的,也就是说当反射ProductsBLL的时候,这些东西就可以用了(注意:ProductsBLL是被标记为System.ComponentModel.DataObject的一个类,所以才可以用这些Attribute,否则会出问题的) 再简要的说明一下“反射”,我们在往设计器里面添加一个控件后,都可以使用属性窗口,这个属性窗口里面能显示这个控件的一些相关的东西,这个就是反射一种用法。要完全说清楚“反射”,不是一件简单的事情,大家有兴趣的话,可以看看MSDN中的相关说明,不过,我建议刚入门的兄弟还是暂时不要看的好,很容易头晕的……4.Attribute做反射理解(告诉反射的用户这个方法是干什么用的,以及是不是默认使用这个方法)例如:[System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, true)]
    public Northwind.ProductsDataTable GetProducts()
    {
    return Adapter.GetProducts();
    }
    其中,System.ComponentModel.DataObjectMethodType.Select说明这是一个用于Select的方法,true说明这是默认的用于Select的方法所以,相对的
    [System.ComponentModel.DataObjectMethodAttribute(System.ComponentModel.DataObjectMethodType.Select, false)]
    public Northwind.ProductsDataTable GetProductByProductID(int productID)
    {
    return Adapter.GetProductByProductID(productID);
    }
    就说明这是一个用于Select的方法,但是它不是默认的用于Select的方法需要说明的是,上面所讨论的System.ComponentModel.DataObjectMethodAttribute是针对ProductsBLL而言的,也就是说当反射ProductsBLL的时候,这些东西就可以用了(注意:ProductsBLL是被标记为System.ComponentModel.DataObject的一个类,所以才可以用这些Attribute,否则会出问题的)