Sdílet prostřednictvím


Práce s vypočítanými sloupci (C#)

Scott Mitchell

Stáhnout PDF

Při vytváření databázové tabulky vám Microsoft SQL Server umožňuje definovat počítaný sloupec, jehož hodnota se počítá z výrazu, který obvykle odkazuje na jiné hodnoty ve stejném záznamu databáze. Tyto hodnoty jsou v databázi jen pro čtení, což vyžaduje zvláštní pozornost při práci s doplňky TableAdapter. V tomto kurzu se dozvíte, jak řešit problémy, které představují počítané sloupce.

Úvod

Microsoft SQL Server umožňuje používat počítané sloupce, což jsou sloupce, jejichž hodnoty se počítají z výrazu, který obvykle odkazuje na hodnoty z jiných sloupců ve stejné tabulce. Datový model sledování času může mít například tabulku s názvem ServiceLog se sloupci ServicePerformed, EmployeeID, Ratea Duration. I když je možné částku splatnou na položku služby (sazbu vynásobenou dobou trvání) vypočítat prostřednictvím webové stránky nebo jiného programového rozhraní, může být užitečné zahrnout do ServiceLog tabulky AmountDue sloupec, který tyto informace ohlásil. Tento sloupec může být vytvořen jako normální sloupec, ale je potřeba ho aktualizovat při každé Rate změně hodnot sloupců nebo Duration . Lepším řešením by bylo vytvořit ze AmountDue sloupce vypočítaný sloupec pomocí výrazu Rate * Duration. Pokud byste to udělali, SQL Server automaticky vypočítali AmountDue hodnotu sloupce pokaždé, když na ni v dotazu odkazujete.

Vzhledem k tomu, že hodnota vypočítaného sloupce je určená výrazem, jsou tyto sloupce jen pro čtení, a proto nemohou mít přiřazené hodnoty v INSERT příkazech or UPDATE . Pokud jsou ale počítané sloupce součástí hlavního dotazu pro objekt TableAdapter, který používá ad hoc příkazy SQL, automaticky se zahrnou do automaticky generovaných INSERT příkazů a UPDATE . V důsledku toho musí být objekty TableAdapter INSERT a UPDATE dotazy a InsertCommand vlastnosti a aktualizovány UpdateCommand tak, aby se odebraly odkazy na všechny počítané sloupce.

Jedním z výzev při použití počítaných sloupců s objektem TableAdapter, který používá ad hoc příkazy SQL, je, že se objekty TableAdapter INSERT a UPDATE dotazy automaticky vygenerují při každém dokončení průvodce konfigurací objektu TableAdapter. Proto se vypočítané sloupce ručně odebrané z INSERT dotazů a UPDATE znovu zobrazí, pokud průvodce znovu spustíte. I když objekty TableAdapter, které používají uložené procedury, touto křehkostí netrpí, mají své vlastní vlastnosti, které budeme řešit v kroku 3.

V tomto kurzu přidáme vypočítaný sloupec do Suppliers tabulky v databázi Northwind a pak vytvoříme odpovídající objekt TableAdapter pro práci s touto tabulkou a jejím vypočítaným sloupcem. Náš tableAdapter bude používat uložené procedury místo ad-hoc příkazů SQL, aby se při použití Průvodce konfigurací tableAdapter neztratily naše vlastní nastavení.

Pusťme se do toho!

Krok 1: Přidání vypočítaného sloupce doSupplierstabulky

Databáze Northwind neobsahuje žádné počítané sloupce, takže je budeme muset přidat sami. Pro účely tohoto kurzu přidáme do Suppliers tabulky počítaný sloupec s názvem FullContactName , který vrátí jméno kontaktu, titul a společnost, pro kterou pracuje, v následujícím formátu: ContactName (ContactTitle, CompanyName). Tento vypočítaný sloupec může být použit v sestavách při zobrazení informací o dodavatelích.

Začněte tím, že Suppliers otevřete definici tabulky tak, že v Průzkumníku serveru kliknete pravým tlačítkem na Suppliers tabulku a v místní nabídce zvolíte Otevřít definici tabulky. Zobrazí se sloupce tabulky a jejich vlastnosti, jako je datový typ, jestli jsou povolené NULL atd. Pokud chcete přidat počítaný sloupec, začněte zadáním názvu sloupce do definice tabulky. Pak zadejte jeho výraz do textového pole (Vzorec) v části Specifikace vypočítaného sloupce v okno Vlastnosti sloupce (viz obrázek 1). Počítaný sloupec FullContactName pojmenujte a použijte následující výraz:

ContactName + ' (' + CASE WHEN ContactTitle IS NOT NULL THEN 
    ContactTitle + ', ' ELSE '' END + CompanyName + ')'

Všimněte si, že řetězce je možné v SQL zřetězení použít operátor .+ Příkaz CASE lze použít jako podmíněný v tradičním programovacím jazyce. Ve výše uvedeném výrazu CASE lze příkaz číst takto: Pokud ContactTitle není NULL , výstupem ContactTitle je hodnota zřetězená čárkou, jinak nevygeneruje nic. Další informace o užitečnosti příkazu najdete v CASE tématu Příkazy SQLCASE.

Poznámka

Místo toho, abychom zde použili CASE příkaz, mohli jsme alternativně použít ISNULL(ContactTitle, ''). ISNULL(checkExpression, replacementValue) vrátí checkExpression , pokud není NULL, v opačném případě vrátí hodnotu replacementValue. I když v tomto případě bude fungovat buď nebo ISNULLCASE , existují složitější scénáře, ve kterých se flexibilita CASE příkazu nedá shodovat s ISNULL.

Po přidání tohoto počítaného sloupce by vaše obrazovka měla vypadat jako snímek obrazovky na obrázku 1.

Přidání počítaného sloupce s názvem FullContactName do tabulky Suppliers

Obrázek 1: Přidání počítaného sloupce s názvem FullContactName do Suppliers tabulky (kliknutím zobrazíte obrázek v plné velikosti)

Po pojmenování počítaného sloupce a zadání jeho výrazu uložte změny tabulky kliknutím na ikonu Uložit na panelu nástrojů, stisknutím kláves Ctrl+S nebo přechodem do nabídky Soubor a zvolením možnosti Uložit Suppliers.

Uložení tabulky by mělo aktualizovat Průzkumníka serveru, včetně právě přidaného Suppliers sloupce v seznamu sloupců tabulky. Výraz zadaný do textového pole (Vzorec) se navíc automaticky přizpůsobí ekvivalentnímu výrazu, který odstraní nepotřebné prázdné znaky, ohraničuje názvy sloupců do závorek ([]) a obsahuje závorky, které explicitněji znázorňují pořadí operací:

(((([ContactName]+' (')+case when [ContactTitle] IS NOT NULL 
    then [ContactTitle]+', ' else '' end)+[CompanyName])+')')

Další informace o počítaných sloupcích v Microsoft SQL Server najdete v technické dokumentaci. Podrobné pokyny k vytváření počítaných sloupců najdete také v tématu Postupy: Určení vypočítaných sloupců.

Poznámka

Ve výchozím nastavení se počítané sloupce fyzicky neukládají do tabulky, ale místo toho se přepočítávají pokaždé, když se na tyto sloupce odkazuje v dotazu. Zaškrtnutím políčka Je trvalý ale můžete dát SQL Server pokyn, aby počítaný sloupec v tabulce fyzicky uložili. Tím umožníte vytvoření indexu pro vypočítaný sloupec, což může zlepšit výkon dotazů, které ve svých WHERE klauzulích používají vypočítanou hodnotu sloupce. Další informace najdete v tématu Vytváření indexů ve vypočítaných sloupcích .

Krok 2: Zobrazení hodnot vypočítaných sloupců

Než začneme pracovat na vrstvě přístupu k datům, chvíli si zabereme zobrazení FullContactName hodnot. V Průzkumníku serveru klikněte pravým tlačítkem na Suppliers název tabulky a v místní nabídce zvolte Nový dotaz. Otevře se okno Dotazu, které nás vyzve k výběru tabulek, které se mají do dotazu zahrnout. Suppliers Přidejte tabulku a klikněte na Zavřít. Dále zkontrolujte CompanyNamesloupce , ContactName, ContactTitlea FullContactName z tabulky Suppliers (Dodavatelé). Nakonec kliknutím na ikonu červeného vykřičníku na panelu nástrojů spusťte dotaz a zobrazte výsledky.

Jak je znázorněno na obrázku 2, výsledky zahrnují FullContactName, které vypisují CompanyNamesloupce , ContactNamea ContactTitle ve formátu ldquo;ContactName (ContactTitle, CompanyName) .

FullContactName používá formát ContactName (ContactTitle, CompanyName).

Obrázek 2: Používá FullContactName formát ContactName (ContactTitle, CompanyName) (kliknutím zobrazíte obrázek v plné velikosti)

Krok 3: PřidáníSuppliersTableAdapterdo vrstvy přístupu k datům

Abychom mohli pracovat s informacemi o dodavateli v naší aplikaci, musíme nejprve vytvořit objekty TableAdapter a DataTable v dal. V ideálním případě by to bylo možné provést pomocí stejných jednoduchých kroků, které jste prozkoumali v předchozích kurzech. Práce s vypočítanými sloupci ale přináší několik vrásek, které si zaslouží diskuzi.

Pokud používáte objekt TableAdapter, který používá ad hoc příkazy SQL, můžete jednoduše zahrnout vypočítaný sloupec do hlavního dotazu objektu TableAdapter prostřednictvím Průvodce konfigurací objektu TableAdapter. Tím se ale automaticky vygenerují INSERT příkazy a UPDATE , které obsahují vypočítaný sloupec. Pokud se pokusíte spustit některou z těchto metod, SqlException bude vyvolán operátor se zprávou Sloupec ColumnName nelze změnit, protože se jedná buď o počítaný sloupec, nebo je výsledkem operátoru UNION. INSERT I když příkaz a UPDATE lze ručně upravit pomocí objektů TableAdapter InsertCommand a UpdateCommand vlastností, při každém opětovném spuštění průvodce konfigurací objektu TableAdapter dojde ke ztrátě těchto přizpůsobení.

Vzhledem k křehkosti objektů TableAdapter, které používají příkazy SQL ad hoc, se při práci s počítanými sloupci doporučuje používat uložené procedury. Pokud používáte existující uložené procedury, jednoduše nakonfigurujte objekt TableAdapter, jak je popsáno v kurzu Použití existujících uložených procedur pro objekty TableAdapter typed dataset . Pokud však průvodce TableAdapter vytvoří uložené procedury za vás, je důležité nejprve vynechat všechny počítané sloupce z hlavního dotazu. Pokud do hlavního dotazu zahrnete počítaný sloupec, průvodce konfigurací objektu TableAdapter vás po dokončení upozorní, že nemůže vytvořit odpovídající uložené procedury. Stručně řečeno, musíme nejprve nakonfigurovat objekt TableAdapter pomocí počítaného hlavního dotazu bez sloupců a poté ručně aktualizovat odpovídající uloženou proceduru a objekt TableAdapter SelectCommand tak, aby zahrnoval vypočítaný sloupec. Tento přístup se podobá postupu použitému v kurzu Aktualizace objektu TableAdapter na použitíJOINs .

Pro účely tohoto kurzu přidáme nový objekt TableAdapter a necháme ho automaticky vytvořit uložené procedury. V důsledku toho budeme muset nejprve vynechat FullContactName vypočítaný sloupec z hlavního dotazu.

Začněte otevřením NorthwindWithSprocs datové sady ve ~/App_Code/DAL složce . Klikněte pravým tlačítkem na Designer a v místní nabídce zvolte, že chcete přidat nový objekt TableAdapter. Tím spustíte průvodce konfigurací tableAdapter. Zadejte databázi, ze které se mají dotazovat data (NORTHWNDConnectionString z Web.config), a klikněte na Další. Vzhledem k tomu, že jsme zatím nevytvořili žádné uložené procedury pro dotazování Suppliers nebo úpravy tabulky, vyberte možnost Vytvořit nové uložené procedury, aby je průvodce vytvořil za nás a klikněte na Další.

Zvolte možnost Vytvořit nové uložené procedury.

Obrázek 3: Volba možnosti Vytvořit nové uložené procedury (kliknutím zobrazíte obrázek v plné velikosti)

Následující krok nás vyzve k zadání hlavního dotazu. Zadejte následující dotaz, který vrátí SupplierIDsloupce , CompanyName, ContactNamea ContactTitle pro každého dodavatele. Všimněte si, že tento dotaz záměrně vynechá vypočítaný sloupec (FullContactName). Odpovídající uloženou proceduru aktualizujeme tak, aby zahrnovala tento sloupec v kroku 4.

SELECT SupplierID, CompanyName, ContactName, ContactTitle
FROM Suppliers

Po zadání hlavního dotazu a kliknutí na Další nám průvodce umožní pojmenovat čtyři uložené procedury, které vygeneruje. Tyto uložené procedury Suppliers_Selectpojmenujte , Suppliers_Insert, Suppliers_Updatea Suppliers_Delete, jak je znázorněno na obrázku 4.

Přizpůsobení názvů automaticky generovaných uložených procedur

Obrázek 4: Přizpůsobení názvů automaticky generovaných uložených procedur (kliknutím zobrazíte obrázek v plné velikosti)

Další krok průvodce nám umožňuje pojmenovat metody TableAdapter a určit vzory používané pro přístup k datům a jejich aktualizaci. Nechte zaškrtnutá všechna tři políčka, ale přejmenujte metodu GetData na GetSuppliers. Dokončete průvodce kliknutím na Dokončit.

Přejmenujte metodu GetData na GetSuppliers.

Obrázek 5: Přejmenujte metodu GetData na GetSuppliers (Kliknutím zobrazíte obrázek v plné velikosti)

Po kliknutí na Dokončit průvodce vytvoří čtyři uložené procedury a přidá do zadané datové sady TableAdapter a odpovídající datatable.

Krok 4: Zahrnutí vypočítaného sloupce do hlavního dotazu objektu TableAdapter

Teď musíme aktualizovat objekty TableAdapter a DataTable vytvořené v kroku 3 tak, aby zahrnovaly FullContactName počítaný sloupec. To zahrnuje dva kroky:

  1. Aktualizuje se uložená Suppliers_Select procedura tak, aby vrátila FullContactName počítaný sloupec, a
  2. Aktualizuje se tabulka DataTable tak, aby obsahovala odpovídající FullContactName sloupec.

Začněte tím, že přejdete do Průzkumníka serveru a přejdete k podrobnostem do složky Uložené procedury. Otevřete uloženou proceduru Suppliers_SelectSELECT a aktualizujte dotaz tak, aby zahrnoval FullContactName počítaný sloupec:

SELECT SupplierID, CompanyName, ContactName, ContactTitle, FullContactName
FROM Suppliers

Uložte změny uložené procedury kliknutím na ikonu Uložit na panelu nástrojů, stisknutím kláves Ctrl+S nebo výběrem možnosti Uložit Suppliers_Select v nabídce Soubor.

Pak se vraťte do Designer DataSet, klikněte pravým tlačítkem na SuppliersTableAdaptera v místní nabídce zvolte Konfigurovat. Všimněte si Suppliers_Select , že sloupec teď obsahuje FullContactName sloupec v kolekci Sloupce dat.

Spusťte Průvodce konfigurací tabulky TableAdapter a aktualizujte sloupce DataTable s.

Obrázek 6: Spuštěním Průvodce konfigurací nástroje TableAdapter pro aktualizaci sloupců tabulky DataTable (kliknutím zobrazíte obrázek v plné velikosti)

Dokončete průvodce kliknutím na Dokončit. Tím se automaticky přidá odpovídající sloupec do SuppliersDataTable. Průvodce objektem TableAdapter je dostatečně inteligentní, aby zjistil, že FullContactName sloupec je počítaný sloupec, a proto je jen pro čtení. V důsledku toho nastaví vlastnost column s ReadOnly na truehodnotu . Pokud to chcete ověřit, vyberte sloupec z SuppliersDataTable pole a pak přejděte na okno Vlastnosti (viz obrázek 7). Všimněte si FullContactName , že sloupec s DataType a MaxLength vlastnosti jsou také nastaveny odpovídajícím způsobem.

Sloupec FullContactName je označen jako jen pro čtení.

Obrázek 7: Sloupec FullContactName je označen jako Read-Only (kliknutím zobrazíte obrázek v plné velikosti)

Krok 5: PřidáníGetSupplierBySupplierIDmetody do třídy TableAdapter

Pro účely tohoto kurzu vytvoříme stránku ASP.NET, která zobrazí dodavatele v aktualizovatelné mřížce. V minulých kurzech jsme aktualizovali jeden záznam z vrstvy obchodní logiky načtením tohoto konkrétního záznamu z dal jako datatable silného typu, aktualizací jeho vlastností a následným odesláním aktualizované tabulky DataTable zpět do dal, aby se změny rozšířily do databáze. Abychom mohli provést tento první krok – načtení aktualizovaného záznamu z DAL – musíme nejprve do dal přidat metodu GetSupplierBySupplierID(supplierID) .

Klikněte pravým tlačítkem na SuppliersTableAdapter položku v návrhu datové sady a v místní nabídce zvolte možnost Přidat dotaz. Stejně jako v kroku 3 nechte průvodce, aby pro nás vygeneroval novou uloženou proceduru výběrem možnosti Vytvořit novou uloženou proceduru (zpět na obrázku 3 najdete snímek obrazovky s tímto krokem průvodce). Vzhledem k tomu, že tato metoda vrátí záznam s více sloupci, označte, že chceme použít dotaz SQL, který je příkazEM SELECT, který vrací řádky, a klikněte na Tlačítko Další.

Zvolte možnost SELECT, která vrací řádky.

Obrázek 8: Zvolte možnost VYBRAT, která vrací řádky (kliknutím zobrazíte obrázek v plné velikosti)

Následující krok nás vyzve k zadání dotazu, který se má použít pro tuto metodu. Zadejte následující příkaz, který vrátí stejná datová pole jako hlavní dotaz, ale pro konkrétního dodavatele.

SELECT SupplierID, CompanyName, ContactName, ContactTitle, FullContactName
FROM Suppliers
WHERE SupplierID = @SupplierID

Další obrazovka nás vyzve, abychom pojmenovali uloženou proceduru, která se bude automaticky generovat. Pojmenujte tuto uloženou proceduru Suppliers_SelectBySupplierID a klikněte na Další.

Pojmenujte Suppliers_SelectBySupplierID Uložená procedura.

Obrázek 9: Pojmenujte uloženou proceduru Suppliers_SelectBySupplierID (kliknutím zobrazíte obrázek v plné velikosti)

Nakonec nás průvodce vyzve k zadání vzorů přístupu k datům a názvů metod, které se mají použít pro TableAdapter. Ponechte zaškrtnutá obě políčka, ale přejmenujte FillBy metody a GetDataBy na FillBySupplierID a GetSupplierBySupplierID.

Pojmenujte metody TableAdapter FillBySupplierID a GetSupplierBySupplierID.

Obrázek 10: Pojmenujte metody FillBySupplierID TableAdapter a GetSupplierBySupplierID (Kliknutím zobrazíte obrázek v plné velikosti)

Dokončete průvodce kliknutím na Dokončit.

Krok 6: Vytvoření vrstvy obchodní logiky

Před vytvořením ASP.NET stránky, která používá počítaný sloupec vytvořený v kroku 1, musíme nejprve přidat odpovídající metody do BLL. Naše ASP.NET stránka, kterou vytvoříme v kroku 7, umožní uživatelům zobrazit a upravit dodavatele. Proto potřebujeme, aby naše společnost BLL poskytla minimálně metodu, jak získat všechny dodavatele, a jinou metodu pro aktualizaci konkrétního dodavatele.

Ve složce vytvořte nový soubor třídy s názvem SuppliersBLLWithSprocs~/App_Code/BLL a přidejte následující kód:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using NorthwindWithSprocsTableAdapters;
[System.ComponentModel.DataObject]
public class SuppliersBLLWithSprocs
{
    private SuppliersTableAdapter _suppliersAdapter = null;
    protected SuppliersTableAdapter Adapter
    {
        get
        {
            if (_suppliersAdapter == null)
                _suppliersAdapter = new SuppliersTableAdapter();
            return _suppliersAdapter;
        }
    }
    [System.ComponentModel.DataObjectMethodAttribute
        (System.ComponentModel.DataObjectMethodType.Select, true)]
    public NorthwindWithSprocs.SuppliersDataTable GetSuppliers()
    {
        return Adapter.GetSuppliers();
    }
    [System.ComponentModel.DataObjectMethodAttribute
        (System.ComponentModel.DataObjectMethodType.Update, true)]
    public bool UpdateSupplier(string companyName, string contactName, 
        string contactTitle, int supplierID)
    {
        NorthwindWithSprocs.SuppliersDataTable suppliers = 
            Adapter.GetSupplierBySupplierID(supplierID);
        if (suppliers.Count == 0)
            // no matching record found, return false
            return false;
        NorthwindWithSprocs.SuppliersRow supplier = suppliers[0];
        supplier.CompanyName = companyName;
        if (contactName == null) 
            supplier.SetContactNameNull(); 
        else 
            supplier.ContactName = contactName;
        if (contactTitle == null) 
            supplier.SetContactTitleNull(); 
        else 
            supplier.ContactTitle = contactTitle;
        // Update the product record
        int rowsAffected = Adapter.Update(supplier);
        // Return true if precisely one row was updated, otherwise false
        return rowsAffected == 1;
    }
}

Stejně jako ostatní třídy BLL máAdapterprotectedvlastnost, SuppliersBLLWithSprocs která vrací instanci SuppliersTableAdapter třídy spolu se dvěma public metodami: GetSuppliers a UpdateSupplier. Metoda GetSuppliers volá a vrací hodnotu vrácenou SuppliersDataTable odpovídající GetSupplier metodou ve vrstvě přístupu k datům. Metoda UpdateSupplier načte informace o konkrétním dodavateli, který se aktualizuje prostřednictvím volání metody DAL s GetSupplierBySupplierID(supplierID) . Potom aktualizuje CategoryNamevlastnosti , ContactNamea ContactTitle a potvrdí tyto změny v databázi voláním metody Data Access Layer s Update a předáním upraveného SuppliersRow objektu.

Poznámka

S výjimkou SupplierID a CompanyNamepovolují hodnoty všechny sloupce v tabulce NULL Dodavatelé. Proto pokud jsou parametry předané contactName nebo contactTitle musíme nastavit odpovídající ContactName vlastnosti a ContactTitle na NULL hodnotu databáze pomocí SetContactNameNull metod a SetContactTitleNull .null

Krok 7: Práce s počítaným sloupcem z prezentační vrstvy

Po přidání počítaných sloupců do Suppliers tabulky a odpovídajícím způsobem aktualizovaných dal a BLL jsme připraveni vytvořit ASP.NET stránku, která bude pracovat s FullContactName počítaným sloupcem. Začněte tím, že ComputedColumns.aspx otevřete stránku ve AdvancedDAL složce a přetáhnete GridView z panelu nástrojů do Designer. Nastavte vlastnost GridView s ID na Suppliers a z její inteligentní značky ji vytvořte vazbu na nový ObjectDataSource s názvem SuppliersDataSource. Nakonfigurujte ObjectDataSource tak, aby používal třídu, která SuppliersBLLWithSprocs jsme přidali zpět v kroku 6, a klikněte na Další.

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

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

Ve třídě jsou definované SuppliersBLLWithSprocs pouze dvě metody: GetSuppliers a UpdateSupplier. Ujistěte se, že tyto dvě metody jsou zadány na kartách SELECT a UPDATE v uvedeném pořadí, a kliknutím na Dokončit dokončete konfiguraci ObjectDataSource.

Po dokončení průvodce konfigurací zdroje dat přidá Visual Studio pro každé z vrácených datových polí BoundField. SupplierID Odeberte BoundField a změňte HeaderText vlastnosti CompanyName, ContactName, ContactTitlea FullContactName BoundFields na Společnost, Jméno kontaktu, Název a Celé jméno kontaktu. V inteligentní značce zaškrtněte políčko Povolit úpravy, abyste zapnuli integrované možnosti úprav GridView.

Kromě přidání BoundFields do objektu GridView dokončení Průvodce zdrojem dat také způsobí, že Visual Studio nastaví vlastnost ObjectDataSource s OldValuesParameterFormatString na original_{0}. Vraťte toto nastavení zpět na výchozí hodnotu {0} .

Po provedení těchto úprav v objektech GridView a ObjectDataSource by měly jejich deklarativní značky vypadat podobně jako následující:

<asp:GridView ID="Suppliers" runat="server" AutoGenerateColumns="False" 
    DataKeyNames="SupplierID" DataSourceID="SuppliersDataSource">
    <Columns>
        <asp:CommandField ShowEditButton="True" />
        <asp:BoundField DataField="CompanyName" 
            HeaderText="Company" 
            SortExpression="CompanyName" />
        <asp:BoundField DataField="ContactName" 
            HeaderText="Contact Name" 
            SortExpression="ContactName" />
        <asp:BoundField DataField="ContactTitle" 
            HeaderText="Title" 
            SortExpression="ContactTitle" />
        <asp:BoundField DataField="FullContactName" 
            HeaderText="Full Contact Name"
            SortExpression="FullContactName" 
            ReadOnly="True" />
    </Columns>
</asp:GridView>
<asp:ObjectDataSource ID="SuppliersDataSource" runat="server"
    SelectMethod="GetSuppliers" TypeName="SuppliersBLLWithSprocs" 
        UpdateMethod="UpdateSupplier">
    <UpdateParameters>
        <asp:Parameter Name="companyName" Type="String" />
        <asp:Parameter Name="contactName" Type="String" />
        <asp:Parameter Name="contactTitle" Type="String" />
        <asp:Parameter Name="supplierID" Type="Int32" />
    </UpdateParameters>
</asp:ObjectDataSource>

Dále přejděte na tuto stránku v prohlížeči. Jak ukazuje obrázek 12, každý dodavatel je uveden v mřížce, která obsahuje FullContactName sloupec, jehož hodnota je jednoduše zřetězení ostatních tří sloupců formátovaných jako ContactName (ContactTitle, CompanyName) .

Každý dodavatel je uveden v mřížce.

Obrázek 12: Každý dodavatel je uvedený v mřížce (kliknutím zobrazíte obrázek v plné velikosti)

Kliknutím na tlačítko Upravit u konkrétního dodavatele dojde k zpětnému odeslání a v rozhraní pro úpravy se tento řádek vykreslí (viz obrázek 13). První tři sloupce se vykreslují ve svém výchozím rozhraní pro úpravy – ovládací prvek TextBox, jehož Text vlastnost je nastavena na hodnotu datového pole. Sloupec FullContactName ale zůstane jako text. Při přidání BoundFields do objektu GridView po dokončení průvodce konfigurací zdroje dat byla vlastnost BoundField s ReadOnly nastavena natrue, FullContactName protože odpovídající FullContactName sloupec v objektu SuppliersDataTable má vlastnost ReadOnly nastavenou na true. Jak je uvedeno v kroku 4, FullContactName vlastnost s ReadOnly byla nastavena na true , protože Objekt TableAdapter zjistil, že sloupec je počítaný sloupec.

Sloupec FullContactName není možné upravovat.

Obrázek 13: Sloupec FullContactName není možné upravovat (kliknutím zobrazíte obrázek v plné velikosti)

Pokračujte aktualizací hodnoty jednoho nebo více upravitelných sloupců a klikněte na Aktualizovat. Všimněte si, jak se FullContactName hodnota s automaticky aktualizuje, aby odrážela změnu.

Poznámka

GridView aktuálně používá BoundFields pro upravitelná pole, což má za následek výchozí rozhraní pro úpravy. Vzhledem k tomu, že CompanyName pole je povinné, mělo by být převedeno na TemplateFieldField, které obsahuje RequiredFieldValidator. Nechám to jako cvičení pro čtenáře, který má zájem. Podrobné pokyny k převodu BoundFieldu na TemplateField a přidání ověřovacích ovládacích prvků a přidání ověřovacích ovládacích prvků najdete v kurzu Přidání ověřovacích ovládacích prvků do kurzu Úpravy a vkládání rozhraní.

Souhrn

Při definování schématu pro tabulku microsoft SQL Server umožňuje zahrnutí počítaných sloupců. Jedná se o sloupce, jejichž hodnoty se počítají z výrazu, který obvykle odkazuje na hodnoty z jiných sloupců ve stejném záznamu. Vzhledem k tomu, že hodnoty počítaných sloupců jsou založené na výrazu, jsou jen pro čtení a nelze jim přiřadit hodnotu v INSERT příkazu nebo UPDATE . To přináší problémy při použití počítaného sloupce v hlavním dotazu objektu TableAdapter, který se pokouší automaticky vygenerovat odpovídající INSERTpříkazy , UPDATEa DELETE .

V tomto kurzu jsme probrali techniky pro obcházení výzev, které představují počítané sloupce. Konkrétně jsme použili uložené procedury v našem nástroji TableAdapter k překonání křehkosti, která je součástí objektů TableAdapter, které používají ad hoc příkazy SQL. Když průvodce TableAdapter vytvoří nové uložené procedury, je důležité, aby hlavní dotaz zpočátku vynechal všechny počítané sloupce, protože jejich přítomnost brání vygenerování uložených procedur úprav dat. Po počáteční konfiguraci objektu TableAdapter je možné jeho SelectCommand uloženou proceduru změnit tak, aby zahrnovala všechny počítané sloupce.

Šťastné programování!

O autorovi

Scott Mitchell, autor sedmi knih o ASP/ASP.NET a zakladatel 4GuysFromRolla.com, pracuje s webovými technologiemi Microsoftu od roku 1998. Scott pracuje jako nezávislý konzultant, školitel a spisovatel. Jeho nejnovější kniha je Sams Teach Yourself ASP.NET 2.0 in 24 Hours. Můžete ho najít na mitchell@4GuysFromRolla.comadrese . nebo prostřednictvím jeho blogu, který najdete na http://ScottOnWriting.NETadrese .

Zvláštní poděkování

Tato série kurzů byla zkontrolována mnoha užitečnými recenzenty. Hlavními recenzenty tohoto kurzu byly Hilton Geisenow a Teresa Murphy. Chcete si projít moje nadcházející články na WEBU MSDN? Pokud ano, dejte mi čáru na mitchell@4GuysFromRolla.comadresu .