Sdílet prostřednictvím


Přidání dalších sloupců do tabulky DataTable (VB)

od Scott Mitchell

Stáhnout PDF

Při použití Průvodce objektem TableAdapter k vytvoření typové datové sady obsahuje odpovídající tabulka DataTable sloupce vrácené hlavním databázovým dotazem. Existují ale situace, kdy datatable musí obsahovat další sloupce. V tomto kurzu se dozvíme, proč se uložené procedury doporučují, když potřebujeme další sloupce tabulky DataTable.

Úvod

Při přidávání objektu TableAdapter do typové datové sady je odpovídající schéma tabulky určeno hlavním dotazem TableAdapter. Pokud například hlavní dotaz vrátí datová pole A, B a C, bude mít tabulka DataTable tři odpovídající sloupce s názvem A, B a C. Kromě hlavního dotazu může Objekt TableAdapter obsahovat i další dotazy, které vracejí například podmnožinu dat na základě některého parametru. Kromě hlavního ProductsTableAdapter dotazu, který vrací informace o všech produktech, obsahuje také metody jako GetProductsByCategoryID(categoryID) a GetProductByProductID(productID), které vrací konkrétní informace o produktu na základě zadaného parametru.

Model, který má schéma DataTable odrážet hlavní dotaz TableAdapteru, funguje dobře, pokud všechny metody TableAdapteru vracejí stejná nebo méně datových polí než ta, která jsou uvedena v hlavním dotazu. Pokud metoda TableAdapter potřebuje vrátit další datová pole, měli bychom odpovídajícím způsobem rozšířit schéma Datové tabulky. V kurzu Master/Detail Pomocí seznamu s odrážkami hlavních záznamů a podrobností DataList jsme přidali metodu do CategoriesTableAdapter, která vrátila datová pole CategoryID, CategoryName a Description, definovaná v hlavním dotazu, plus NumberOfProducts, což je další datové pole, které hlásilo počet produktů přidružených ke každé kategorii. Do nového sloupce jsme ručně přidali nový sloupec CategoriesDataTable , abychom mohli zachytit hodnotu datového NumberOfProducts pole z této nové metody.

Jak je popsáno v kurzu Uploading Files , je potřeba mít velkou pozornost s objekty TableAdapter, které používají ad hoc příkazy SQL a mají metody, jejichž datová pole přesně neodpovídají hlavnímu dotazu. Pokud je průvodce konfigurací TableAdapter znovu spuštěn, aktualizuje všechny metody TableAdapter s tak, aby jejich seznam datových polí odpovídal hlavnímu dotazu. V důsledku toho se všechny metody s přizpůsobenými seznamy sloupců vrátí do seznamu sloupců hlavního dotazu a nevrátí očekávaná data. K tomuto problému nedochází při použití uložených procedur.

V tomto kurzu se podíváme na to, jak rozšířit schéma datové tabulky tak, aby zahrnovalo další sloupce. Kvůli křehkosti TableAdapteru při použití ad-hoc SQL příkazů v tomto kurzu použijeme uložené procedury. Další informace o konfiguraci TableAdapteru pro použití uložených procedur najdete v kurzech Vytváření nových uložených procedur pro TableAdaptery typizovaného datového kitu a Použití existujících uložených procedur pro TableAdaptery typizovaného datového kitu.

Krok 1: PřidáníPriceQuartilesloupce doProductsDataTable

V kurzu Vytváření nových uložených procedur pro Typed DataSet s TableAdapter jsme vytvořili Typed DataSet s názvem NorthwindWithSprocs. Tato datová sada v současné době obsahuje dvě datové tabulky: ProductsDataTable a EmployeesDataTable. Obsahuje ProductsTableAdapter následující tři metody:

  • GetProducts – hlavní dotaz, který vrátí všechny záznamy z Products tabulky
  • GetProductsByCategoryID(categoryID) - vrátí všechny produkty se zadaným ID kategorie.
  • GetProductByProductID(productID) - vrátí konkrétní produkt se zadaným ID produktu.

Hlavní dotaz a dvě další metody vrátí stejnou sadu datových polí, konkrétně všechny sloupce z Products tabulky. Neexistují žádné korelované poddotazy ani JOINs načítající související data z tabulek Categories nebo Suppliers. ProductsDataTable Proto má odpovídající sloupec pro každé pole v Products tabulce.

V tomto kurzu přidáme do ProductsTableAdapter metodu pojmenovanou GetProductsWithPriceQuartile, která vrátí všechny produkty. Kromě standardních datových polí GetProductsWithPriceQuartile produktů budou obsahovat PriceQuartile také datové pole, které označuje, pod který kvartil spadá cena produktu. Například produkty, jejichž ceny jsou v nejdražších 25% budou mít PriceQuartile hodnotu 1, zatímco ty, jejichž ceny spadají do dolních 25% budou mít hodnotu 4. Než se budeme starat o vytvoření uložené procedury pro vrácení těchto informací, musíme nejprve aktualizovat ProductsDataTable a přidat sloupec pro uložení PriceQuartile výsledků při použití metody GetProductsWithPriceQuartile.

Otevřete NorthwindWithSprocs DataSet a klikněte pravým tlačítkem myši na ProductsDataTable. V místní nabídce zvolte Přidat a pak vyberte Sloupec.

Přidání nového sloupce do tabulky ProductsDataTable

Obrázek 1: Přidání nového sloupce do obrazu ProductsDataTable (kliknutím zobrazíte obrázek s plnou velikostí)

Tím přidáte nový sloupec do tabulky DataTable s názvem Column1 typu System.String. Musíme aktualizovat název sloupce na PriceQuartile a jeho typ na System.Int32, protože bude použit k uložení čísla mezi 1 a 4. Vyberte nově přidaný sloupec v okně ProductsDataTable Vlastnosti a v okně Vlastnosti nastavte Name vlastnost na PriceQuartile a DataType vlastnost na System.Int32.

Nastavte vlastnosti Název a DatovýTyp nového sloupce

Obrázek 2: Nastavení nových sloupců Name a DataType vlastností (kliknutím zobrazíte obrázek v plné velikosti)

Jak ukazuje obrázek 2, je možné nastavit další vlastnosti, například jestli musí být hodnoty ve sloupci jedinečné, pokud je sloupec automatickým přírůstkovým sloupcem, jestli jsou nebo nejsou povolené hodnoty databáze NULL atd. Ponechte tyto hodnoty nastavené na výchozí hodnoty.

Krok 2: VytvořeníGetProductsWithPriceQuartilemetody

Teď, když ProductsDataTable byla aktualizována tak, aby zahrnovala PriceQuartile sloupec, jsme připraveni vytvořit metodu GetProductsWithPriceQuartile . Začněte tak, že kliknete pravým tlačítkem na objekt TableAdapter a v místní nabídce zvolíte Přidat dotaz. Tím se zobrazí průvodce konfigurací dotazu TableAdapter, který nás nejprve vyzve, jestli chceme použít ad hoc příkazy SQL nebo novou nebo existující uloženou proceduru. Vzhledem k tomu, že ještě nemáme uloženou proceduru, která vrací údaje o kvartilech cen, dovolíme TableAdapteru, aby pro nás tuto uloženou proceduru vytvořil. Vyberte možnost Vytvořit novou uloženou proceduru a klepněte na tlačítko Další.

Řekněte průvodci TableAdapter, aby vytvořil uloženou proceduru pro nás.

Obrázek 3: Řekněte průvodci TableAdapter, aby vytvořil uloženou proceduru pro nás (kliknutím zobrazíte obrázek v plné velikosti).

Na následující obrazovce, která je znázorněna na obrázku 4, se průvodce zeptá, jaký typ dotazu chcete přidat. Protože metoda GetProductsWithPriceQuartile vrátí všechny sloupce a záznamy z tabulky Products, vyberte možnost SELECT, která vrací řádky, a klikněte na Další.

Náš dotaz bude příkaz SELECT, který vrátí více řádků.

Obrázek 4: Náš dotaz bude příkaz SELECT , který vrátí více řádků (kliknutím zobrazíte obrázek s plnou velikostí).

Dále se zobrazí výzva k SELECT dotazu. Do průvodce zadejte následující dotaz:

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

Výše uvedený dotaz používá novou NTILE funkci SQL Serveru 2005 k rozdělení výsledků do čtyř skupin, kde jsou skupiny určeny UnitPrice hodnotami seřazenými v sestupném pořadí.

Tvůrce dotazů bohužel neví, jak analyzovat OVER klíčové slovo a při analýze výše uvedeného dotazu zobrazí chybu. Proto zadejte výše uvedený dotaz přímo do textového pole v průvodci bez použití Tvůrce dotazů.

Poznámka:

Další informace o NTILE a SQL Server 2005 a další funkce řazení naleznete v tématu ROW_NUMBER (Transact-SQL) a oddíl Pořadí funkcí z SQL Server 2005 Books Online.

Po zadání SELECT dotazu a kliknutí na Další nás průvodce požádá, abychom zadali název uložené procedury, která se vytvoří. Pojmenujte novou uloženou proceduru Products_SelectWithPriceQuartile a klikněte na tlačítko Další.

Pojmenujte uloženou proceduru Products_SelectWithPriceQuartile

Obrázek 5: Pojmenování uložené procedury Products_SelectWithPriceQuartile (kliknutím zobrazíte obrázek v plné velikosti)

Nakonec se zobrazí výzva k pojmenování metod TableAdapter. Nechejte zaškrtnutá políčka Vyplnit DataTable a Vrátit DataTable a pojmenujte metody FillWithPriceQuartile a GetProductsWithPriceQuartile.

Pojmenujte metody TableAdapter s a klepněte na tlačítko Dokončit

Obrázek 6: Pojmenování metod TableAdapter s a kliknutí na tlačítko Dokončit (kliknutím zobrazíte obrázek v plné velikosti)

Se zadaným SELECT dotazem a uloženými procedurami a metodami TableAdapter klikněte na tlačítko Dokončit a dokončete průvodce. V tomto okamžiku se může v průvodci zobrazit upozornění nebo dva, které říkají, že OVER konstruktor nebo příkaz SQL není podporován. Tato upozornění je možné ignorovat.

Po dokončení průvodce by objekt TableAdapter měl obsahovat metody FillWithPriceQuartile a GetProductsWithPriceQuartile databáze by měla obsahovat uloženou proceduru s názvem Products_SelectWithPriceQuartile. Chvíli si ověřte, že Objekt TableAdapter skutečně obsahuje tuto novou metodu a zda uložená procedura byla do databáze správně přidána. Pokud při kontrole databáze nevidíte uloženou proceduru, zkuste kliknout pravým tlačítkem myši na složku Uložené procedury a zvolit Aktualizovat.

Ověření přidání nové metody do prvku TableAdapter

Obrázek 7: Ověření přidání nové metody do prvku TableAdapter

Ujistěte se, že databáze obsahuje uloženou proceduru Products_SelectWithPriceQuartile.

Obrázek 8: Ujistěte se, že databáze obsahuje uloženou proceduru Products_SelectWithPriceQuartile (kliknutím zobrazíte obrázek s plnou velikostí)

Poznámka:

Jednou z výhod použití uložených procedur místo ad hoc příkazů SQL je, že opětovné spuštění Průvodce konfigurací TableAdapter neupraví seznamy sloupců uložených procedur. Ověřte to tak, že kliknete pravým tlačítkem myši na objekt TableAdapter, v místní nabídce vyberete možnost Konfigurovat, aby se spustil průvodce, a kliknutím na tlačítko Dokončit ho dokončete. Dále přejděte do databáze a prohlédněte si uloženou proceduru Products_SelectWithPriceQuartile . Všimněte si, že jeho seznam sloupců nebyl změněn. Pokud jsme používali příkazy SQL ad hoc, opětovné spuštění Průvodce konfigurací TableAdapter by vrátilo tento seznam sloupců dotazu tak, aby odpovídal seznamu sloupců hlavního dotazu, a tím odebrání příkazu NTILE z dotazu používaného metodou GetProductsWithPriceQuartile .

Při vyvolání metody datové vrstvy GetProductsWithPriceQuartile spustí TableAdapter uloženou proceduru Products_SelectWithPriceQuartile a přidá řádek do ProductsDataTable pro každý vrácený záznam. Datová pole vrácená uloženou procedurou se mapují na ProductsDataTable sloupce s. Vzhledem k tomu, že z uložené procedury bylo vráceno datové pole PriceQuartile, jeho hodnota je přiřazena do sloupce ProductsDataTable s PriceQuartile.

U metod TableAdapter, jejichž dotazy nevracejí PriceQuartile datové pole, je hodnota sloupce PriceQuartile určena jeho vlastností DefaultValue. Jak ukazuje obrázek 2, tato hodnota je nastavená na DBNullvýchozí hodnotu. Pokud dáváte přednost jiné výchozí hodnotě, jednoduše nastavte DefaultValue vlastnost odpovídajícím způsobem. Stačí se ujistit, že hodnota DefaultValue je platná pro sloupec DataType (tj, System.Int32 pro PriceQuartile sloupec).

V tuto chvíli jsme provedli nezbytné kroky pro přidání dalšího sloupce do tabulky DataTable. Abychom ověřili, že tento další sloupec funguje podle očekávání, vytvoříme stránku ASP.NET, která zobrazí názvy jednotlivých produktů, cenu a kvartil ceny. Než to ale uděláme, musíme nejprve aktualizovat vrstvu obchodní logiky tak, aby zahrnovala metodu, která volá metodu DAL s GetProductsWithPriceQuartile . V kroku 3 aktualizujeme BLL a pak vytvoříme stránku ASP.NET v kroku 4.

Krok 3: Rozšíření vrstvy obchodní logiky

Než použijeme novou GetProductsWithPriceQuartile metodu z prezentační vrstvy, měli bychom nejprve přidat odpovídající metodu do BLL. ProductsBLLWithSprocs Otevřete soubor třídy a přidejte následující kód:

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

Stejně jako ostatní metody načítání dat v ProductsBLLWithSprocs, metoda GetProductsWithPriceQuartile jednoduše volá odpovídající metodu DAL GetProductsWithPriceQuartile a vrací její výsledky.

Krok 4: Zobrazení informací o cenách kvartilu na webové stránce ASP.NET

S dokončením přidání BLL jsme připraveni vytvořit ASP.NET stránku, která zobrazuje cenu kvartilu pro každý produkt. AddingColumns.aspx Otevřete stránku ve AdvancedDAL složce a přetáhněte Objekt GridView z panelu nástrojů do Návrháře a nastavte jeho ID vlastnost na Products. Ve smart tagu GridView vytvořte vazbu na nový ObjectDataSource s názvem ProductsDataSource. Nakonfigurujte ObjectDataSource tak, aby používal metodu ProductsBLLWithSprocs třídy s GetProductsWithPriceQuartile . Vzhledem k tomu, že se jedná o mřížku určenou jen pro čtení, nastavte rozevírací seznamy na kartách UPDATE, INSERT a DELETE na (Žádné).

Konfigurace ObjectDataSource pro použití třídy ProductsBLLWithSprocs

Obrázek 9: Konfigurace ObjectDataSource pro použití ProductsBLLWithSprocs třídy (kliknutím zobrazíte obrázek v plné velikosti)

Načtení informací o produktu z GetProductsWithPriceQuartile – metoda

Obrázek 10: Načtení informací o produktu z GetProductsWithPriceQuartile metody (kliknutím zobrazíte obrázek s plnou velikostí)

Po dokončení průvodce konfigurací zdroje dat Visual Studio automaticky přidá BoundField nebo CheckBoxField do GridView pro každé datové pole vrácené metodou. Jedním z těchto datových polí je PriceQuartilesloupec, který jsme přidali do ProductsDataTable kroku 1.

Upravte v GridView pole s odebráním všech BoundFields, kromě ProductName, UnitPrice a PriceQuartile. UnitPrice Nakonfigurujte BoundField tak, aby naformátoval jeho hodnotu jako měnu, a aby UnitPrice a PriceQuartile BoundFields byly zarovnané doprava a na střed, v daném pořadí. Nakonec aktualizujte zbývající vlastnosti BoundFields HeaderText na produkt, cenu a cenový kvartil. Zaškrtněte také políčko Povolit řazení v inteligentní značce prvku GridView.

Po těchto úpravách by deklarativní kód GridView a ObjectDataSource měly vypadat takto:

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

Obrázek 11 ukazuje tuto stránku při návštěvě v prohlížeči. Všimněte si, že na začátku jsou produkty seřazeny podle jejich ceny v sestupném pořadí s každým produktem přiřazenou odpovídající PriceQuartile hodnotou. Tato data mohou být samozřejmě seřazena podle jiných kritérií s hodnotou sloupce Price Quartil, která stále odrážejí pořadí produktů s ohledem na cenu (viz obrázek 12).

Produkty jsou objednány podle jejich cen

Obrázek 11: Produkty jsou objednány podle jejich cen (kliknutím zobrazíte obrázek s plnou velikostí)

Produkty jsou objednány podle jejich názvů.

Obrázek 12: Produkty jsou seřazené podle jejich názvů (kliknutím zobrazíte obrázek s plnou velikostí)

Poznámka:

Pomocí několika řádků kódu bychom mohli rozšířit GridView tak, aby vybarvil řádky produktů na základě jejich hodnoty PriceQuartile. Tyto produkty můžeme obarvit v prvním kvartilu světle zelenou, ty ve druhém kvartilu světle žlutou a tak dále. Vyzývám vás, abyste si udělali moment a přidali tuto funkci. Pokud potřebujete připomenutí, jak formátovat GridView, projděte si kurz vlastního formátování na základě dat.

Alternativní přístup – vytvoření dalšího objektu TableAdapter

Jak jsme viděli v tomto kurzu, když jsme přidali metodu do objektu TableAdapter, který vrací jiná datová pole než ta, která jsou uvedená v hlavním dotazu, můžeme do tabulky DataTable přidat odpovídající sloupce. Takový přístup ale funguje dobře pouze v případě, že v objektu TableAdapter existuje malý počet metod, které vracejí různá datová pole a pokud se tato alternativní datová pole příliš neliší od hlavního dotazu.

Místo přidávání sloupců do tabulky DataTable můžete místo toho přidat další objekt TableAdapter do datové sady obsahující metody z prvního objektu TableAdapter, který vrací jiná datová pole. Pro účely tohoto kurzu jsme místo přidání sloupce PriceQuartile do ProductsDataTable (kde se používá pouze metodou GetProductsWithPriceQuartile) mohli přidat do datové sady pojmenované ProductsWithPriceQuartileTableAdapter další TableAdapter, který by použil uloženou proceduru Products_SelectWithPriceQuartile jako svůj hlavní dotaz. ASP.NET stránky, které potřebovaly získat informace o produktu s cenovým kvartilem, by používaly ProductsWithPriceQuartileTableAdapter, zatímco ty, které to nepotřebovaly, mohly nadále používat ProductsTableAdapter.

Přidáním nového objektu TableAdapter zůstanou DataTables nedotčené a jejich sloupce přesně odpovídají datovým políčkům vráceným metodami TableAdapteru. Další tableAdaptery ale můžou zavádět opakující se úlohy a funkce. Pokud by například tyto ASP.NET stránky, které zobrazily PriceQuartile sloupec, také potřebovaly zajistit podporu vložení, aktualizace a odstranění, ProductsWithPriceQuartileTableAdapter by musel mít správně nakonfigurované vlastnosti InsertCommand, UpdateCommand a DeleteCommand. I když by tyto vlastnosti zrcadlily ProductsTableAdapter, tato konfigurace představuje další krok. Kromě toho existují dva způsoby, jak aktualizovat, odstranit nebo přidat produkt do databáze – prostřednictvím těchto ProductsTableAdapter tříd.ProductsWithPriceQuartileTableAdapter

Stažení pro tento kurz zahrnuje ProductsWithPriceQuartileTableAdapter třídu v NorthwindWithSprocs datové sadě, která ilustruje tento alternativní přístup.

Shrnutí

Ve většině scénářů vrátí všechny metody v objektu TableAdapter stejnou sadu datových polí, ale v některých případech může být potřeba vrátit další pole. Například v tutoriálu Master/Detail Using a Bulleted List of Master Records with a Details DataList jsme přidali metodu do CategoriesTableAdapter, která kromě datových polí hlavního dotazu vrátila pole NumberOfProducts, které udávalo počet produktů přidružených ke každé kategorii. V tomto kurzu jsme se podívali na přidání metody do ProductsTableAdapter, která vrátila pole PriceQuartile navíc k datovým polím hlavního dotazu. Abychom mohli zachytit další datová pole vrácená metodami TableAdapter, musíme do tabulky DataTable přidat odpovídající sloupce.

Pokud plánujete ručně přidávat sloupce do tabulky DataTable, doporučuje se, aby Objekt TableAdapter používal uložené procedury. Pokud TableAdapter používá ad-hoc příkazy SQL, kdykoli se spustí Průvodce konfigurací TableAdapter, všechny seznamy datových polí metod se vrátí k datovým polím vráceným hlavním dotazem. Tento problém se nevztahuje na uložené procedury, což je důvod, proč jsou doporučené a byly použity v tomto kurzu.

Šťastné programování!

O autorovi

Scott Mitchell, autor sedmi knih ASP/ASP.NET a zakladatel 4GuysFromRolla.com, pracuje s webovými technologiemi Microsoftu od roku 1998. Scott pracuje jako nezávislý konzultant, trenér a spisovatel. Jeho nejnovější kniha je Sams Teach Yourself ASP.NET 2.0 ve 24 hodinách. Může být dosažitelný na mitchell@4GuysFromRolla.comadrese .

Zvláštní díky

Tato série kurzů byla zkontrolována mnoha užitečnými recenzenty. Vedoucí recenzenti pro tento kurz byli Randy Schmidt, Jacky Goor, Bernadette Leigh a Hilton Giesenow. Chcete si projít nadcházející články MSDN? Pokud ano, napište mi zprávu na mitchell@4GuysFromRolla.com.