共用方式為


新增其他 DataTable 資料行 (VB)

作者 :Scott Mitchell

下載 PDF

使用 TableAdapter 精靈建立具類型的數據集時,對應的 DataTable 會包含主資料庫查詢所傳回的數據行。 但在某些情況下,DataTable 需要包含其他數據行。 在本教學課程中,我們會了解當我們需要其他 DataTable 數據行時,為何建議使用預存程式。

簡介

將 TableAdapter 新增至具類型的數據集時,對應的 DataTable 架構是由 TableAdapter 的主要查詢所決定。 例如,如果主查詢傳回數據欄位 ABC,DataTable 會有三個名為 ABC 的對應數據行。除了其主要查詢之外,TableAdapter 還可以包含其他查詢,這些查詢可能會根據某些參數傳回數據的子集。 例如,除了ProductsTableAdapter會傳回所有產品相關信息的主查詢之外,它也包含和GetProductByProductID(productID)GetProductsByCategoryID(categoryID)方法,其會根據提供的參數傳回特定產品資訊。

如果所有 TableAdapter 方法傳回的數據欄位都與主查詢中指定的數據欄位相同或更少,則 DataTable 架構的模型會反映 TableAdapter 的主要查詢正常運作。 如果 TableAdapter 方法需要傳回其他數據欄位,則我們應該據以展開 DataTable 的架構。 在 主要/詳細數據使用主記錄的點符清單搭配詳細數據清單 教學課程中,我們已將方法新增至 CategoriesTableAdapter 傳回 CategoryID主要查詢中定義之 、 CategoryName和數據 Description 欄位加上 NumberOfProducts的其他數據欄位,此數據欄位會報告與每個類別相關聯的產品數目。 我們手動將新的數據行新增至 CategoriesDataTable ,以便從這個新方法擷取 NumberOfProducts 數據域值。

上傳檔案 教學課程中所述,請務必謹慎使用使用臨機操作 SQL 語句的 TableAdapters,並具有數據字段無法精確比對主要查詢的方法。 如果重新執行 TableAdapter 組態精靈,它會更新所有 TableAdapter s 方法,使其數據欄位清單符合主要查詢。 因此,任何具有自定義數據行清單的方法都會還原為主要查詢的數據行清單,而不會傳回預期的數據。 使用預存程式時,不會發生此問題。

在本教學課程中,我們將探討如何擴充 DataTable 架構以包含其他數據行。 由於使用臨機操作 SQL 語句時 TableAdapter 的片段性,在本教學課程中,我們將使用預存程式。 如需設定 TableAdapter 以使用預存程式的詳細資訊,請參閱針對具型別 DataSet s TableAdapters 使用現有的預存程式教學課程的建立預存程式。

步驟 1:將數據行PriceQuartile新增至ProductsDataTable

建立具型別數據集數據表Adapters 的新預存程式中 ,我們建立了名為 NorthwindWithSprocs的具型別數據集。 此 DataSet 目前包含兩個 DataTable: ProductsDataTableEmployeesDataTableProductsTableAdapter具有下列三種方法:

  • GetProducts - 主查詢,它會從 Products 數據表傳回所有記錄
  • GetProductsByCategoryID(categoryID) - 傳回具有指定 categoryID 的所有產品。
  • GetProductByProductID(productID) - 傳回具有指定 productID 的特定產品。

主要查詢和兩個額外的方法都會傳回相同的數據集欄位,也就是數據表中的所有數據行 Products 。 沒有相互關聯的子查詢或 JOINCategoriesSuppliers 數據表提取相關數據。 因此, ProductsDataTable 數據表中的每個 Products 欄位都有對應的數據行。

在本教學課程中,讓我們將方法新增至 ProductsTableAdapter 會傳回所有產品的具名 GetProductsWithPriceQuartile 。 除了標準產品數據欄位之外,也會包含一個PriceQuartile數據欄位,GetProductsWithPriceQuartile指出產品價格低於四分位數。 例如,價格在最昂貴 25% 的產品會有 PriceQuartile 1 的值,而價格落在底部 25% 的產品則值為 4。 不過,在擔心建立預存程式以傳回這項資訊之前,我們必須先更新 ProductsDataTable 以包含數據行,以在使用 方法時GetProductsWithPriceQuartile保留PriceQuartile結果。

NorthwindWithSprocs開啟 DataSet,然後以ProductsDataTable滑鼠右鍵按鍵 。 從操作功能表選擇 [新增],然後挑選 [數據行]。

將新數據行新增至 ProductsDataTable

圖 1:將新數據行新增至 ProductsDataTable (按兩下即可檢視完整大小的影像)

這會將新的數據行新增至類型 System.String為 Column1 的 DataTable。 我們需要將此數據行的名稱更新為 PriceQuartile 及其類型, System.Int32 因為它將用來保存介於 1 到 4 之間的數位。 選取 中ProductsDataTable新增的數據行,然後從 屬性視窗,將 Name 屬性設定為 PriceQuartile,並將 DataType 屬性設定為 System.Int32

設定新的資料行名稱和 DataType 屬性

圖 2:設定 [新增數據行] NameDataType [屬性] (按兩下即可檢視完整大小的影像)

如圖 2 所示,還有其他可設定的屬性,例如數據行中的值是否必須是唯一的,如果數據行是自動遞增數據行,是否允許資料庫 NULL 值等等。 保留這些值設定為預設值。

步驟 2:建立GetProductsWithPriceQuartile方法

ProductsDataTable既然 已更新 為包含數據PriceQuartile行,我們即可建立 GetProductsWithPriceQuartile 方法。 首先,以滑鼠右鍵按下 TableAdapter,然後從操作功能表選擇 [新增查詢]。 這會顯示 TableAdapter 查詢組態精靈,它會先提示我們使用臨機操作 SQL 語句或新的或現有的預存程式。 因為我們還沒有傳回價格分位數數據的預存程式,讓我們允許 TableAdapter 為我們建立此預存程式。 選取 [建立新的預存程式] 選項,然後按 [下一步]。

指示 TableAdapter 精靈為我們建立預存程式

圖 3:指示 TableAdapter 精靈為我們建立預存程式 (按兩下以檢視完整大小的影像)

在後續畫面中,如圖 4 所示,精靈會詢問我們要新增的查詢類型。 GetProductsWithPriceQuartile由於方法會從Products數據表傳回所有數據行和記錄,請選取SELECT 以傳回數據列選項,然後按 [下一步]。

我們的查詢會是傳回多個數據列的SELECT語句

圖 4:我們的查詢會傳 SELECT 回多個數據列的語句, (Click 以檢視完整大小的影像)

接下來,系統會提示查詢 SELECT 。 在精靈中輸入下列查詢:

SELECT ProductID, ProductName, SupplierID, CategoryID, 
       QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder, 
       ReorderLevel, Discontinued,
       NTILE(4) OVER (ORDER BY UnitPrice DESC) as PriceQuartile
FROM Products

上述查詢會使用 SQL Server 2005 的新NTILE式,將結果分割成四個群組,其中群組是由UnitPrice以遞減順序排序的值所決定。

不幸的是,查詢產生器不知道如何剖析 關鍵詞, OVER 而且會在剖析上述查詢時顯示錯誤。 因此,在精靈的文本框中直接輸入上述查詢,而不使用查詢產生器。

注意

如需 NTILE 和 SQL Server 2005 其他排名函式的詳細資訊,請參閱《SQL Server 在線叢書》中的 ROW_NUMBER (Transact-SQL) 排名函式一節。

輸入 SELECT 查詢並按兩下一步之後,精靈會要求我們為其建立的預存程式提供名稱。 將新的預存程式 Products_SelectWithPriceQuartile 命名為 ,然後按 [下一步]。

將預存程式命名為 Products_SelectWithPriceQuartile

圖 5:將預存程式 Products_SelectWithPriceQuartile 命名為 (按兩下即可檢視完整大小的影像)

最後,系統會提示我們命名 TableAdapter 方法。 同時保留 [填滿 DataTable] 和 [傳回 DataTable] 複選框,並將方法 FillWithPriceQuartile 命名為 和 GetProductsWithPriceQuartile

將 TableAdapter 命名為方法,然後按兩下 [完成]

圖 6:將 TableAdapter 命名為方法,然後按兩下 [完成] (按兩下即可檢視完整大小的影像)

使用 SELECT 指定的查詢以及名為 的預存程式和 TableAdapter 方法,按兩下 [完成] 以完成精靈。 此時,您可能會從精靈收到警告或兩個警告,指出 OVER 不支援 SQL 建構或語句。 您可以忽略這些警告。

完成精靈之後,TableAdapter 應該包含 FillWithPriceQuartileGetProductsWithPriceQuartile 方法,而且資料庫應該包含名為 Products_SelectWithPriceQuartile的預存程式。 請花一點時間確認 TableAdapter 確實包含這個新的方法,而且預存程式已正確新增至資料庫。 檢查資料庫時,如果您沒有看到預存程式,請嘗試以滑鼠右鍵按兩下 [預存程式] 資料夾,然後選擇 [重新整理]。

確認已將新的方法新增至 TableAdapter

圖 7:確認已將新的方法新增至 TableAdapter

確定資料庫包含Products_SelectWithPriceQuartile預存程式

圖 8:確定資料庫包含 Products_SelectWithPriceQuartile 預存程式 (按兩下即可檢視完整大小的映像)

注意

使用預存程式而非臨機操作 SQL 語句的其中一個優點是,重新執行 TableAdapter 組態精靈將不會修改預存程式數據行清單。 在 TableAdapter 上按下滑鼠右鍵,從操作功能表選擇 [設定] 選項以啟動精靈,然後單擊 [完成] 以完成它,以驗證此問題。 接下來,移至資料庫並檢視 Products_SelectWithPriceQuartile 預存程式。 請注意,其數據行清單尚未修改。 如果我們使用臨機操作 SQL 語句,重新執行 TableAdapter 組態精靈會還原此查詢數據行清單,以符合主要查詢數據行清單,藉此從方法所使用的 GetProductsWithPriceQuartile 查詢中移除 NTILE 語句。

叫用數據存取層 s GetProductsWithPriceQuartile 方法時,TableAdapter 會 Products_SelectWithPriceQuartile 執行預存程式,並在每個傳回的記錄中加入數據列 ProductsDataTable 。 預存程式所傳回的數據欄位會對應至 ProductsDataTable s 資料行。 由於預存程式傳 PriceQuartile 回了數據欄位,所以其值會指派給 ProductsDataTable s PriceQuartile 數據行。

對於查詢未傳回 PriceQuartile 數據欄位的 TableAdapter 方法,數據 PriceQuartile 行的值是其 DefaultValue 屬性所指定的值。 如圖 2 所示,此值設定為 DBNull預設值。 如果您想要不同的預設值,只要據此設定 DefaultValue 屬性即可。 只要確定 DefaultValue 值在 DataType 數據行 (有效,也就是 System.Int32 數據 PriceQuartile 行) 。

此時,我們已執行將其他數據行新增至 DataTable 的必要步驟。 若要確認此額外數據行如預期般運作,讓我們建立一個 ASP.NET 頁面,以顯示每個產品名稱、價格和價格分位數。 不過,在這麼做之前,我們必須先更新商業規則層,以包含呼叫 DAL s GetProductsWithPriceQuartile 方法的方法。 我們將在步驟 3 中更新 BLL,然後在步驟 4 中建立 ASP.NET 頁面。

步驟 3:增強商業規則層

在使用簡報層的新 GetProductsWithPriceQuartile 方法之前,我們必須先將對應的方法新增至 BLL。 ProductsBLLWithSprocs開啟類別檔案,並新增下列程式代碼:

<System.ComponentModel.DataObjectMethodAttribute_
    (System.ComponentModel.DataObjectMethodType.Select, False)> _
Public Function GetProductsWithPriceQuartile() As NorthwindWithSprocs.ProductsDataTable
    Return Adapter.GetProductsWithPriceQuartile()
End Function

如同 中的其他 ProductsBLLWithSprocs數據擷取方法, GetProductsWithPriceQuartile 方法只會呼叫 DAL 對應的 GetProductsWithPriceQuartile 方法,並傳回其結果。

步驟 4:在 ASP.NET 網頁中顯示價格分位數資訊

隨著 BLL 新增完成,我們就可以建立 ASP.NET 頁面,以顯示每個產品的價格四分位數。 AddingColumns.aspx開啟資料夾中的頁面AdvancedDAL,然後將 GridView 從 [工具箱] 拖曳至 Designer,並將其 ID 屬性設定為 Products。 從 GridView 的智慧標記,將其系結至名為 ProductsDataSource的新 ObjectDataSource。 將 ObjectDataSource 設定為使用 ProductsBLLWithSprocs 類別 s GetProductsWithPriceQuartile 方法。 因為這是唯讀的方格,請將 UPDATE、INSERT 和 DELETE 索引標籤標的下拉式清單設定為 [無]) (。

將 ObjectDataSource 設定為使用 ProductsBLLWithSprocs 類別

圖 9:將 ObjectDataSource 設定為使用 ProductsBLLWithSprocs 類別 (按兩下即可檢視完整大小的映射)

從 GetProductsWithPriceQuartile 方法擷取產品資訊

圖 10:從 GetProductsWithPriceQuartile 方法擷取產品資訊 (按兩下以檢視完整大小的影像)

完成 [設定數據源精靈] 之後,Visual Studio 會自動針對 方法傳回的每個數據字段,將 BoundField 或 CheckBoxField 新增至 GridView。 其中一個數據欄位是 PriceQuartile,也就是我們在步驟 1 中新增至 ProductsDataTable 的數據行。

編輯 GridView 的字段,移除 、UnitPrice、 和 PriceQuartile BoundFields。ProductName 設定 UnitPrice BoundField 將其值格式化為貨幣,並分別具有 UnitPricePriceQuartile BoundFields 靠右對齊和置中對齊。 最後,分別將其餘 BoundFields HeaderText 屬性更新為 Product、Price 和 Price Quartile。 此外,請從 GridView 的智慧標記中核取 [啟用排序] 複選框。

這些修改之後,GridView 和 ObjectDataSource 的宣告式標記看起來應該如下所示:

<asp:GridView ID="Products" runat="server" AllowSorting="True"
    AutoGenerateColumns="False" DataKeyNames="ProductID" 
    DataSourceID="ProductsDataSource">
    <Columns>
        <asp:BoundField DataField="ProductName" HeaderText="Product" 
            SortExpression="ProductName" />
        <asp:BoundField DataField="UnitPrice" DataFormatString="{0:c}" 
            HeaderText="Price" HtmlEncode="False" 
            SortExpression="UnitPrice">
            <ItemStyle HorizontalAlign="Right" />
        </asp:BoundField>
        <asp:BoundField DataField="PriceQuartile" HeaderText="Price Quartile" 
            SortExpression="PriceQuartile">
            <ItemStyle HorizontalAlign="Center" />
        </asp:BoundField>
    </Columns>
</asp:GridView>
<asp:ObjectDataSource ID="ProductsDataSource" runat="server" 
    OldValuesParameterFormatString="original_{0}"
    SelectMethod="GetProductsWithPriceQuartile" 
    TypeName="ProductsBLLWithSprocs">
</asp:ObjectDataSource>

圖 11 會在瀏覽瀏覽器時顯示此頁面。 請注意,一開始,產品會依價格遞減順序排序,且每個產品都指派了適當的 PriceQuartile 值。 當然,此數據可依價格分位數數據行值的其他準則排序,仍然反映價格 (的產品排名,請參閱圖 12) 。

產品依價格排序

圖 11:產品依價格排序, (按兩下即可檢視完整大小的影像)

產品依其名稱排序

圖 12:產品依其名稱排序, (按兩下即可檢視完整大小的影像)

注意

透過幾行程式代碼,我們可以增強 GridView,使其根據 PriceQuartile 其值來著色產品數據列。 我們可能會在第一個分位數為淺綠色、第二個分位數為淺黃色等產品色彩。 我們鼓勵您花一點時間新增這項功能。 如果您需要重新整理 GridView 的格式設定,請參閱 以數據為基礎的自定義格式 設定教學課程。

替代方法 - 建立另一個 TableAdapter

如本教學課程中所見,將方法新增至 TableAdapter,以傳回主要查詢所拼字以外的數據欄位時,我們可以將對應的數據行新增至 DataTable。 不過,只有在 TableAdapter 中有少量的方法傳回不同的數據欄位,而且這些替代數據欄位與主要查詢沒有太多差異時,這類方法才能正常運作。

您可以改為將另一個 TableAdapter 新增至 DataTable,其中包含第一個傳回不同數據欄位之 TableAdapter 方法的 DataSet,而不是將數據行加入 DataTable。 在本教學課程中,我們可以將另一個 TableAdapter 新增至使用預存程式做為其主要查詢的 DataSet,而不是將數據行新增PriceQuartile至方法) 所使用的 (GetProductsWithPriceQuartileProductsWithPriceQuartileTableAdapterProducts_SelectWithPriceQuartileProductsDataTable ASP.NET 取得具有價格分位數之產品信息的頁面會使用 ProductsWithPriceQuartileTableAdapterProductsTableAdapter,而無法繼續使用 的分位數。

藉由加入新的 TableAdapter,DataTable 會維持不變,而且其數據行會精確地鏡像其 TableAdapter s 方法所傳回的數據欄位。 不過,其他 TableAdapters 可能會引入重複的工作和功能。 例如,如果 ASP.NET 顯示 PriceQuartile 數據行的頁面也需要提供插入、更新和刪除支援,則必須 ProductsWithPriceQuartileTableAdapter 正確設定其 InsertCommandUpdateCommandDeleteCommand 屬性。 雖然這些屬性會鏡像 ProductsTableAdapter ,但此設定會引進額外的步驟。 此外,現在有兩種方式可以透過和 ProductsWithPriceQuartileTableAdapter 類別,將產品更新、刪除或新增至資料庫ProductsTableAdapter

本教學課程的下載包含 ProductsWithPriceQuartileTableAdapter DataSet 中的 NorthwindWithSprocs 類別,說明這個替代方法。

摘要

在大部分情況下,TableAdapter 中的所有方法都會傳回相同的數據集,但有時候特定方法或兩個方法可能需要傳回額外的欄位。 例如,在 [主要/詳細數據使用主要記錄的項目符號清單搭配詳細數據清單] 教學課程中,除了主要查詢的數據欄位之外,還傳回一個CategoriesTableAdapterNumberOfProducts字段,報告與每個類別相關聯的產品數目。 在本教學課程中,我們探討在 除了 ProductsTableAdapter 主要查詢數據欄位之外,還會在 中新增傳回 PriceQuartile 欄位的方法。 若要擷取 TableAdapter 方法傳回的其他數據欄位,我們需要將對應的數據行新增至 DataTable。

如果您打算手動將數據行新增至 DataTable,建議 TableAdapter 使用預存程式。 如果 TableAdapter 使用臨機操作 SQL 語句,則每當執行 TableAdapter 組態精靈時,所有方法數據欄位清單都會還原為主要查詢所傳回的數據欄位。 此問題不會延伸至預存程式,這就是為什麼建議並在本教學課程中使用。

快樂的程序設計!

關於作者

Scott Mitchell 是七份 ASP/ASP.NET 書籍的作者,以及 1998 年以來與 Microsoft Web 技術合作的 4GuysFromRolla.com 作者。 Scott 是獨立顧問、訓練員和作者。 他的最新書籍是 Sams 在 24 小時內自行 ASP.NET 2.0。 您可以透過mitchell@4GuysFromRolla.com部落格來連線到 ,您可以在 找到http://ScottOnWriting.NET

特別感謝

本教學課程系列是由許多實用的檢閱者檢閱。 本教學課程的首席檢閱者是 Randy Schmidt、Jacky Goor、Bernadette 一個和一個 Giesenow。 有興趣檢閱即將推出的 MSDN 文章嗎? 如果是,請將一行 mitchell@4GuysFromRolla.com放在 。