返回“ASP.NET 2.0數據教程目錄”
導言:
當向類型化的數據集(Typed DataSet)添加一個TableAdapter時 ,相應的DataTable的構架已經由TableAdapter的主查詢定義好了.比如,如果主 查詢返回A, B,C這3個域,那麼 DataTable將有對應的3個列A, B,和C.除了主查詢 以外,TableAdapter還可以包含其他的查詢,可能是返回基於某些參數的數據。 比如,ProductsTableAdapter的主查詢返回所有產品的信息,此外, ProductsTableAdapter還包含諸如GetProductsByCategoryID(categoryID) 和 GetProductByProductID(productID)的方法,它們根據指派的參數返回特定的產 品信息.
如果TableAdapter的方法返回的列涵蓋在主查詢裡,工作起來沒 有問題。但如果返回的列並沒有涵蓋在主查詢,那麼我們就需要對DataTable的構 架進行擴充.在第35章《Master/Detail Using a Bulleted List of Master Records with a Details DataList》裡,我們向CategoriesTableAdapter添加方 法以返回 CategoryID, CategoryName, Description和NumberOfProducts列。其 中前3列是涵蓋在主查詢裡的,而NumberOfProducts列沒有在主查詢裡定義,它返 回的是每個category相關產品的數目.我們可以向CategoriesDataTable手工添加 一列,以便於統計從新方法返回的NumberOfProducts列的值.
在第54章 《Uploading Files》我們探討過,對使用ad-hoc SQL statements構建且其方法 返回的列超出主查詢范圍的TableAdapters必須多加留意.因為一旦重新運行設置 向導的話,它將對TableAdapter的方法進行更新,使其返回的列與主查詢相匹配. 不過如果使用存儲過程的話就不會出現這種情況.
在本文我們將考察如何 擴展DataTable的構架以包含額外的列。我們都知道使用ad-hoc SQL statements 構架的TableAdapter不穩定,本文我們將用存儲過程來構架.你可以參考第67章《 the Creating New Stored Procedures for the Typed DataSet’s TableAdapters》和第68章《Using Existing Stored Procedures for the Typed DataSet’s TableAdapters》來獲取設置TableAdapter使用存儲過程的更多 信息.
第一步:向ProductsDataTable添加一個PriceQuartile列
在 第67章裡我們創建了一個名為NorthwindWithSprocs的類型化的數據集.該數據集 目前包含2個DataTables:ProductsDataTable以及 EmployeesDataTable。
其中ProductsTableAdapter包含3個方法:
.GetProducts——主查詢,返回Products表的所有記錄
.GetProductsByCategoryID(categoryID)——根據指定的 categoryID值返回所有產品
.GetProductByProductID(productID) ——根據指定的productID值返回所有的產品
主查詢及另外2個 方法都返回相同的數據列,也就是Products表的所有列,並沒有返回Categories 以及Suppliers表的相關數據.
在本文,我們將向ProductsTableAdapter添 加一個名為GetProductsWithPriceQuartile 的方法,它返回所有的產品.除了標 准的數據列外,它還返回PriceQuartile列,它用四分位數來衡量產品價格下跌程 度.如果產品價格上升了25%,那麼其值為1,如果下降為25%,那麼其值為4.在我 們創建一個存儲過程來返回這種信息之前,我們首先需要更新ProductsDataTable ,新添一列來包含GetProductsWithPriceQuartile方法返回的 PriceQuartile 值.
打開NorthwindWithSprocs數據集,在ProductsDataTable上右鍵單擊 ,選擇“ Add” ,再選擇“Column”.
圖1:向ProductsDataTable新添一列