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 umožňuje Microsoft SQL Server definovat počítaný sloupec, jehož hodnota se vypočí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í aspekty při práci s objekty TableAdapter. V tomto kurzu se naučíme, jak řešit problémy, které představují počítané sloupce.

Úvod

Microsoft SQL Server umožňuje 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. Jako příklad může mít datový model sledování času tabulku s názvy ServiceLog sloupců, včetně ServicePerformed, EmployeeID, Ratea Duration, mimo jiné. I když se částka splatná za položku služby (je sazba vynásobená dobou trvání) dá vypočítat prostřednictvím webové stránky nebo jiného programového rozhraní, může být užitečné zahrnout sloupec do ServiceLog tabulky s názvem AmountDue , která ohlásila tyto informace. Tento sloupec může být vytvořen jako normální sloupec, ale je potřeba ho aktualizovat kdykoliv, když Rate Duration se hodnoty sloupců změní. Lepším přístupem by bylo vytvořit AmountDue sloupec vypočítaným sloupcem pomocí výrazu Rate * Duration. Tím by SQL Server automaticky vypočítal AmountDue hodnotu sloupce pokaždé, když byl odkazován v dotazu.

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

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

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

Pojďme začít!

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

Databáze Northwind nemá žádné počítané sloupce, takže si ho budeme muset přidat sami. V tomto kurzu přidáme do Suppliers tabulky FullContactName počítaný sloupec, který vrátí jméno, název kontaktu a společnost, pro kterou pracují v následujícím formátu: ContactName (ContactTitle, CompanyName). Tento počítaný sloupec se může použít v sestavách při zobrazení informací o dodavatelích.

Začněte otevřením Suppliers definice tabulky tak, že kliknete pravým tlačítkem myši na Suppliers tabulku v Průzkumníku serveru a v místní nabídce zvolíte Otevřít definici tabulky. Zobrazí se sloupce tabulky a jejich vlastnosti, jako je například jejich datový typ, to, jestli povolí NULL a tak dále. Pokud chcete přidat počítaný sloupec, začněte zadáním názvu sloupce do definice tabulky. Potom zadejte jeho výraz do textového pole (Vzorec) v části Specifikace vypočítaného sloupce v okno Vlastnosti Sloupce (viz obrázek 1). Pojmenujte vypočítaný sloupec FullContactName 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 mohou být zřetězeny v SQL pomocí operátoru + . Tento CASE příkaz 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 hodnota zřetězená čárkou, jinak vygenerujte nic. Další informace o užitečnosti CASE příkazu najdete v tématu Příkazy SQLCASE.

Poznámka:

Místo použití CASE příkazu zde můžeme použít alternativně ISNULL(ContactTitle, ''). ISNULL(checkExpression, replacementValue) vrátí checkExpression , pokud není NULL, jinak vrátí hodnotu replacementValue. I když buď ISNULL nebo CASE bude fungovat v této instanci, existují složitější scénáře, kdy flexibilita CASE příkazu nemůže být spárována ISNULL.

Po přidání tohoto počítaného sloupce by 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 Dodavatelů

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

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 ctrl+S nebo v nabídce Soubor a výběrem možnosti Uložit Suppliers.

Uložení tabulky by mělo aktualizovat Průzkumníka serveru, včetně právě přidaného sloupce v Suppliers seznamu sloupců tabulky. Kromě toho se výraz zadaný do textového pole (Vzorec) automaticky upraví na ekvivalentní výraz, který odstraní nepotřebné prázdné znaky, obklopuje názvy sloupců hranatými závorkami ([]) a obsahuje závorky, aby bylo explicitnější zobrazit 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 Serveru najdete v technické dokumentaci. Podívejte se také na postupy: Určení počítaných sloupců pro podrobný návod k vytváření počítaných sloupců.

Poznámka:

Ve výchozím nastavení nejsou vypočítané sloupce fyzicky uloženy v tabulce, ale přepočítávají se pokaždé, když se na tyto sloupce odkazuje v dotazu. Zaškrtnutím políčka Je trvalý ale můžete dát SQL Serveru pokyn, aby fyzicky ukládal vypočítaný sloupec do tabulky. To umožňuje vytvoření indexu ve počítaném sloupci, 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, může trvat minutu, než se hodnoty zobrazí FullContactName . 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. Tím se zobrazí 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 zaškrtněte políčko CompanyName, ContactNamea ContactTitleFullContactName sloupce z tabulky Dodavatelé. Nakonec kliknutím na ikonu červeného vykřičníku na panelu nástrojů spusťte dotaz a zobrazte výsledky.

Jak ukazuje obrázek 2, výsledky zahrnují , které uvádějí FullContactNameCompanyName, ContactNamea ContactTitle sloupce používající formát ldquo;ContactName (ContactTitle, CompanyName) .

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

Obrázek 2: Použití FullContactName formátu ContactName (,CompanyName) (ContactTitlekliknutím zobrazíte obrázek v plné velikosti)

Krok 3: Přidání vrstvySuppliersTableAdapterpřístupu k datům

Abychom mohli pracovat s informacemi o dodavateli v naší aplikaci, musíme napřed v dal vytvořit TableAdapter a DataTable. 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 počítanými sloupci ale představuje několik vrásek, které si zaslouží diskuzi.

Pokud používáte TableAdapter, který používá ad hoc příkazy SQL, můžete jednoduše zahrnout vypočítaný sloupec do hlavního dotazu TableAdapter prostřednictvím Průvodce konfigurací TableAdapter. To ale automaticky vygeneruje INSERT a UPDATE příkazy, které obsahují vypočítaný sloupec. Pokud se pokusíte provést jednu z těchto metod, sloupec ColumnName nelze upravit, SqlException protože se jedná o počítaný sloupec nebo je výsledkem operátoru UNION vyvolán. I když je možné příkaz INSERT a UPDATE příkaz ručně upravit pomocí objektu TableAdapter s InsertCommand a UpdateCommand vlastností, dojde ke ztrátě těchto přizpůsobení při opětovném spuštění průvodce konfigurací TableAdapter.

Vzhledem k brittleness tableAdapter, které používají ad-hoc příkazy SQL, doporučujeme používat uložené procedury při práci s počítanými sloupci. Pokud používáte existující uložené procedury, jednoduše nakonfigurujte TableAdapter, jak je popsáno v kurzu Použití existujících uložených procedur pro Typed DataSet s TableAdapers . Pokud máte průvodce Objektem TableAdapter, vytvořte uložené procedury za vás, je však důležité na začátku vynechat všechny počítané sloupce z hlavního dotazu. Pokud do hlavního dotazu zahrnete počítaný sloupec, průvodce konfigurací TableAdapter vás po dokončení informuje, ž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 pak ručně aktualizovat odpovídající uloženou proceduru a Objekty TableAdapter s SelectCommand tak, aby zahrnovaly vypočítaný sloupec. Tento přístup je podobný tomu, který se používá v kurzu Aktualizace objektů TableAdapter na použitíJOIN.

Pro účely tohoto kurzu přidáme nový 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. V Návrháři klikněte pravým tlačítkem myši a v místní nabídce zvolte přidání nového objektu TableAdapter. Tím se spustí průvodce konfigurací TableAdapter. Zadejte databázi pro dotazování dat z (NORTHWNDConnectionString z Web.config) a klepněte na tlačítko Další. Vzhledem k tomu, že jsme zatím nevytvořili žádné uložené procedury pro dotazování nebo úpravu Suppliers tabulky, vyberte možnost Vytvořit nové uložené procedury, aby je průvodce vytvořil pro nás a klikněte na Tlačítko Další.

Volba možnosti Vytvořit nové uložené procedury

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

Následující krok nás vyzve k zadání hlavního dotazu. Zadejte následující dotaz, který vrátí SupplierIDsloupce , CompanyNameContactNamea ContactTitle sloupce pro každého dodavatele. Všimněte si, že tento dotaz záměrně vynechá vypočítaný sloupec (FullContactName); aktualizujeme odpovídající uloženou proceduru tak, aby zahrnoval 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. Pojmenujte tyto uložené procedury Suppliers_Select, Suppliers_Inserta Suppliers_DeleteSuppliers_Update, jak znázorňuje obrázek 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 s plnou velikostí)

Další krok průvodce nám umožňuje pojmenovat metody TableAdapter s a určit vzory používané pro přístup k datům a jejich aktualizaci. Nechejte 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řejmenování metody GetData na GetSuppliers

Obrázek 5: Přejmenování GetData metody na GetSuppliers (kliknutím zobrazíte obrázek s plnou velikostí)

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

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

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

  1. Suppliers_Select Aktualizace uložené procedury tak, aby vrátila FullContactName vypočítaný sloupec, a
  2. Aktualizace tabulky DataTable tak, aby zahrnovala 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_Select SELECT a aktualizujte dotaz tak, aby zahrnoval FullContactName vypočí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 z nabídky Soubor.

Potom se vraťte do Návrháře datové sady, klikněte pravým tlačítkem myši na SuppliersTableAdapterpoložku a v místní nabídce zvolte Konfigurovat. Všimněte si, že Suppliers_Select sloupec teď obsahuje FullContactName sloupec v kolekci Datových sloupců.

Spuštěním Průvodce konfigurací TableAdapter aktualizujte sloupce tabulky DataTable s.

Obrázek 6: Spuštění Průvodce konfigurací 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 TableAdapter je dostatečně inteligentní, aby zjistil, že FullContactName je sloupec počítaný sloupec, a proto jen pro čtení. V důsledku toho nastaví vlastnost sloupce ReadOnly na true. To ověříte tak, že vyberete sloupec z SuppliersDataTable okno Vlastnosti a pak přejdete na okno Vlastnosti (viz obrázek 7). Všimněte si, že FullContactName sloupce 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: FullContactName Sloupec je označen jako jen pro čtení (kliknutím zobrazíte obrázek s plnou velikostí)

Krok 5: PřidáníGetSupplierBySupplierIDmetody do tableAdapter

Pro účely tohoto kurzu vytvoříme ASP.NET stránku, která zobrazí dodavatele v aktualizovatelné mřížce. V předchozí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 rozšířit změny do databáze. K dosažení tohoto prvního kroku – načtení záznamu, který se aktualizuje z DAL – musíme nejprve přidat metodu GetSupplierBySupplierID(supplierID) do DAL.

V návrhu SuppliersTableAdapter datové sady klikněte pravým tlačítkem myši a v místní nabídce zvolte možnost Přidat dotaz. Jak jsme to udělali v kroku 3, nechte průvodce vygenerovat novou uloženou proceduru pro nás výběrem možnosti Vytvořit novou uloženou proceduru (odkaz na obrázek 3 pro snímek obrazovky tohoto kroku průvodce). Vzhledem k tomu, že tato metoda vrátí záznam s více sloupci, označuje, že chceme použít dotaz SQL, který vrací řádky, a klepněte na tlačítko Další.

Výběr možnosti SELECT, která vrací řádky

Obrázek 8: Volba možnosti SELECT, která vrací řádky (kliknutím zobrazíte obrázek s plnou velikostí)

Následující krok nás vyzve, abychom dotaz použili pro tuto metodu. Zadejte následující pole, 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 automaticky vygeneruje. Pojmenujte tuto uloženou proceduru Suppliers_SelectBySupplierID a klepněte na tlačítko Další.

Pojmenujte uloženou proceduru Suppliers_SelectBySupplierID

Obrázek 9: Pojmenování uložené procedury 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. Nechte obě zaškrtávací políčka zaškrtnutá, ale přejmenujte FillBySupplierID je FillBy na GetDataBy a GetSupplierBySupplierIDv uvedeném pořadí.

Pojmenujte metody TableAdapter FillBySupplierID a GetSupplierBySupplierID

Obrázek 10: Pojmenujte metody FillBySupplierID TableAdapter a GetSupplierBySupplierID (kliknutím zobrazíte obrázek s plnou velikostí)

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

Krok 6: Vytvoření vrstvy obchodní logiky

Než vytvoříme ASP.NET stránku, která používá vypočítaný sloupec vytvořený v kroku 1, musíme nejprve přidat odpovídající metody v BLL. Naše ASP.NET stránka, kterou vytvoříme v kroku 7, umožní uživatelům zobrazovat a upravovat dodavatele. Proto potřebujeme, aby naše BLL poskytla minimálně metodu, jak získat všechny dodavatele a další k aktualizaci konkrétního dodavatele.

Ve složce vytvořte nový soubor SuppliersBLLWithSprocs ~/App_Code/BLL třídy 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á Adapter protected vlastnost, SuppliersBLLWithSprocs která vrací instanci SuppliersTableAdapter třídy spolu se dvěma public metodami: GetSuppliers a UpdateSupplier. Metoda GetSuppliers volá a vrací 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 GetSupplierBySupplierID(supplierID) . Poté aktualizuje CategoryName, ContactNamea vlastnosti a ContactTitle potvrdí tyto změny do databáze voláním metody Data Access Layer s Update předáním upraveného SuppliersRow objektu.

Poznámka:

SupplierID S výjimkou a CompanyName, všechny sloupce v tabulce Dodavatelé umožňují NULL hodnoty. Proto pokud předaný contactName parametr nebo contactTitle parametry null potřebujeme nastavit odpovídající ContactName a ContactTitle vlastnosti na NULL hodnotu databáze pomocí SetContactNameNull metod a SetContactTitleNull metod.

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

S přidaným počítaným sloupcem do Suppliers tabulky a dal a BLL odpovídajícím způsobem jsme připraveni vytvořit ASP.NET stránku, která funguje s vypočítaným FullContactName sloupcem. Začněte otevřením ComputedColumns.aspx stránky ve AdvancedDAL složce a přetažením objektu GridView ze sady nástrojů do Návrháře. Nastavte Vlastnost GridView ID na Suppliers a, z její inteligentní značky, vytvořit vazbu na nový ObjectDataSource pojmenovaný SuppliersDataSource. Nakonfigurujte ObjectDataSource tak, aby používal SuppliersBLLWithSprocs třídu, která jsme přidali zpět v kroku 6, a klikněte na Tlačítko Další.

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

Obrázek 11: Konfigurace ObjectDataSource pro použití SuppliersBLLWithSprocs třídy (kliknutím zobrazíte obrázek s plnou velikostí)

Ve třídě jsou definovány 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 tlačítko Dokončit dokončete konfiguraci ObjectDataSource.

Po dokončení průvodce konfigurací zdroje dat přidá Visual Studio pro každou vrácená datová pole BoundField. SupplierID Odeberte BoundField a změňte HeaderText vlastnosti objektu CompanyName, ContactName, ContactTitlea FullContactName BoundFields na Název společnosti, Jméno kontaktu, Název a Úplné jméno kontaktu. Z inteligentní značky zaškrtněte políčko Povolit úpravy a zapněte integrované možnosti úprav GridView.

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

Po provedení těchto úprav v GridView a ObjectDataSource by jejich deklarativní kód měl 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>

V dalším kroku 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 s plnou velikostí)

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

Sloupec FullContactName není možné upravovat.

Obrázek 13: FullContactName Sloupec není možné upravit (kliknutím zobrazíte obrázek s plnou velikostí)

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

Poznámka:

GridView aktuálně používá BoundFields pro upravitelná pole, což vede k výchozímu rozhraní pro úpravy. Vzhledem k tomu, že je CompanyName pole povinné, mělo by být převedeno na TemplateField, které obsahuje RequiredFieldValidator. Opouštím to jako cvičení pro zájemce čtenáře. Podrobné pokyny k převodu rozhraní BoundField na TemplateField 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 třídy Editing and Inserting Interfaces.

Shrnutí

Při definování schématu pro tabulku umožňuje Microsoft SQL Server 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 pro počítané sloupce jsou založené na výrazu, jsou určené jen pro čtení a nelze jim přiřadit hodnotu v příkazu INSERT ani UPDATE v příkazu. To přináší problémy při použití počítaného sloupce v hlavním dotazu objektu TableAdapter, který se pokusí automaticky generovat odpovídající INSERT, UPDATEa DELETE příkazy.

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 tabulce TableAdapter k překonání brittleness, které jsou součástí TableAdapers, které používají ad-hoc příkazy SQL. Při vytváření nových uložených procedur průvodce TableAdapter 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 lze 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 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 za 24 hodin. Je dostupný na mitchell@4GuysFromRolla.comadrese . nebo prostřednictvím svého blogu, který lze najít na http://ScottOnWriting.NET.

Zvláštní díky

Tato série kurzů byla zkontrolována mnoha užitečnými recenzenty. Vedoucí hodnotící pro tento kurz byli Hilton Geisenow a Teresa Murphy. Chcete si projít nadcházející články MSDN? Pokud ano, zahoďte mi řádek na mitchell@4GuysFromRolla.com.