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

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 TableAdaptery. V tomto kurzu se dozvíte, jak řešit výzvy, 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. Například datový model sledování času může mít tabulku s názvem ServiceLog se sloupci ServicePerformed, EmployeeIDRate, a Duration. I když je možné částku splatnou na položku služby (tj. 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 sloupec s názvem AmountDue , který tyto informace ohlásil. Tento sloupec může být vytvořen jako normální sloupec, ale bude potřeba ho Rate aktualizovat vždy, když se změní hodnoty sloupce nebo Duration . Lepším řešením by bylo vytvořit AmountDue ze sloupce počítaný sloupec pomocí výrazu Rate * Duration. To by způsobilo, že SQL Server automaticky vypočítal AmountDue hodnotu sloupce při každém odkazu v dotazu.

Vzhledem k tomu, že hodnota počítaných sloupců je určena výrazem, jsou tyto sloupce jen pro čtení, a proto nemohou mít přiřazené hodnoty v INSERT příkazech nebo UPDATE . Pokud jsou však počítané sloupce součástí hlavního dotazu pro objekt TableAdapter, který používá ad hoc příkazy SQL, jsou automaticky zahrnuty do automaticky generovaných INSERT příkazů a UPDATE . V důsledku toho je potřeba aktualizovat objekty TableAdapter INSERT a UPDATE dotazy a InsertCommand vlastnosti a UpdateCommand odebrat 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í pokaždé, když se dokončí průvodce konfigurací objektu TableAdapter. Proto se vypočítané sloupce ručně odebrané z INSERT dotazů a UPDATE znovu zobrazí, pokud se průvodce znovu spustí. I když objekty TableAdapter, které používají uložené procedury, touto křehkostí netrpí, 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í objekt TableAdapter pro práci s touto tabulkou a jejím počítaným sloupcem. Naše funkce TableAdapter bude místo ad hoc příkazů SQL používat uložené procedury, aby se při použití průvodce konfigurací nástroje TableAdapter neztratily naše vlastní nastavení.

Pojďme začít!

Krok 1: Přidání počítaný sloupec doSupplierstabulky

Databáze Northwind nemá žá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 počítaný sloupec může být použit v sestavách při zobrazení informací o dodavatelích.

Začněte tak, že otevřete definici Suppliers tabulky tak, že kliknete pravým tlačítkem 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, například jejich datový typ, jestli povolují NULL s atd. 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). 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é zřetězení v SQL pomocí operátoru + . 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 ne NULL , výstupem ContactTitle je hodnota zřetězená s čá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 bude, existují složitější scénáře, kdy se flexibilita CASE příkazu nemůže shodovat pomocí ISNULLpříkazu .

Po přidání tohoto počítaný sloupec by měla obrazovka vypadat jako snímek obrazovky na obrázku 1.

Přidání počítaný sloupec s názvem FullContactName do tabulky Suppliers

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

Po pojmenování počítaný sloupec a zadání jeho výrazu uložte změny v tabulce kliknutím na ikonu Uložit na panelu nástrojů, stisknutím kláves Ctrl+S nebo tak, že přejdete do nabídky Soubor a zvolíte 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, obklopuje názvy sloupců hranatými závorkami ([]) a obsahuje závorky, které explicitněji zobrazují 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í počítaných sloupců .

Poznámka

Ve výchozím nastavení se počítané sloupce fyzicky neukládají do tabulky, ale přepočítávají se při každém odkazu v dotazu. Zaškrtnutím políčka Je trvalé můžete dát SQL Server pokyn k fyzickému uložení počítaného sloupce v tabulce. Tím umožníte 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ů u počítaných sloupců .

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

Než začneme pracovat na vrstvě přístupu k datům, zabereme chvíli 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. Zobrazí 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 v tabulce Dodavatelé. Nakonec kliknutím na ikonu červeného vykřičníku na panelu nástrojů spusťte dotaz a zobrazte výsledky.

Jak znázorňuje obrázek 2, výsledky zahrnují FullContactName, který uvádí CompanyNamesloupce , ContactNamea ContactTitle ve formátu 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í doSuppliersTableAdaptervrstvy přístupu k datům

Abychom mohli pracovat s informacemi o dodavateli v naší aplikaci, musíme nejprve 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é jsme prozkoumali v předchozích kurzech. Práce s počítanými sloupci však 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 počítaný sloupec do hlavního dotazu TableAdapter prostřednictvím Průvodce konfigurací objektu TableAdapter. Tím se ale automaticky vygenerují INSERT příkazy a UPDATE , které obsahují počítaný sloupec. Pokud se pokusíte spustit některou SqlException z těchto metod, vyvolá se zpráva Sloupec ColumnName nelze změnit, protože se jedná o počítaný sloupec nebo je výsledkem operátoru UNION. INSERT I když příkaz a UPDATE lze ručně upravit pomocí tableAdapter s InsertCommand a UpdateCommand vlastností, tato přizpůsobení budou ztracena při každém opětovném spuštění průvodce konfigurací objektu TableAdapter.

Vzhledem k křehkosti objektů TableAdapter, které používají ad hoc příkazy SQL, doporučujeme při práci s počítanými sloupci 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 s . Pokud ale 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í 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ý hlavní dotaz bez sloupců a pak ručně aktualizovat odpovídající uloženou proceduru a objekt TableAdapter s SelectCommand tak, aby zahrnoval počítaný sloupec. Tento přístup se podobá přístupu 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, aby pro nás automaticky vytvořil uložené procedury. V důsledku toho budeme muset nejprve vynechat FullContactName počí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, jestli chcete přidat nový objekt TableAdapter. Tím se spustí průvodce konfigurací nástroje TableAdapter. Zadejte databázi, ze které se má dotazovat na data (NORTHWNDConnectionString z Web.config) a klikněte na Další. Vzhledem k tomu, že jsme ještě nevytvořili žádné uložené procedury pro dotazování nebo úpravy Suppliers tabulky, vyberte možnost Vytvořit nové uložené procedury, aby je průvodce vytvořil pro 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 , CompanyNameContactName, a 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 tento sloupec zahrnoval 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. 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í metody na GetDataGetSuppliers (kliknutím zobrazíte obrázek v plné velikosti)

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

Krok 4: Zahrnutí vypočí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. Aktualizuje se tabulka 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_SelectSELECT a aktualizujte dotaz tak, FullContactName aby zahrnoval 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.

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í nástroje TableAdapter a aktualizujte sloupce datové tabulky.

Obrázek 6: Spuštění Průvodce konfigurací tableAdapter pro aktualizaci sloupců datové tabulky (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 sloupec je počítaný, a proto jen pro čtení. V důsledku toho nastaví vlastnost sloupce na ReadOnlytruehodnotu . Ověříte to tak, že vyberete sloupec z SuppliersDataTable a pak přejdete na okno Vlastnosti (viz Obrázek 7). Všimněte si FullContactName , že sloupce 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: FullContactName Sloupec 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 ASP.NET stránku, 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. K provedení tohoto prvního kroku – načtení aktualizovaného záznamu z DAL – musíme do DAL nejprve přidat metodu GetSupplierBySupplierID(supplierID) .

V návrhu datové sady klikněte pravým tlačítkem na SuppliersTableAdapter položku a z místní nabídky 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 (snímek obrazovky s tímto krokem průvodce najdete na obrázku 3). Vzhledem k tomu, že tato metoda vrátí záznam s více sloupci, označte, že chceme použít dotaz SQL, který vrací řádky, a klikněte na Další.

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

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

Následující krok nás vyzve k použití dotazu 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 k pojmenování uložené procedury, která se automaticky vygeneruje. Pojmenujte tuto uloženou proceduru Suppliers_SelectBySupplierID a klikněte na Další.

Pojmenujte uloženou proceduru Suppliers_SelectBySupplierID

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 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 v plné velikosti)

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 do pole 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 BLL poskytla minimálně metodu, jak získat všechny dodavatele a dalšího k 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:

Imports NorthwindWithSprocsTableAdapters
<System.ComponentModel.DataObject()> _
Public Class SuppliersBLLWithSprocs
    Private _suppliersAdapter As SuppliersTableAdapter = Nothing
    Protected ReadOnly Property Adapter() As SuppliersTableAdapter
        Get
            If _suppliersAdapter Is Nothing Then
                _suppliersAdapter = New SuppliersTableAdapter()
            End If
            Return _suppliersAdapter
        End Get
    End Property
    <System.ComponentModel.DataObjectMethodAttribute _
        (System.ComponentModel.DataObjectMethodType.Select, True)> _
    Public Function GetSuppliers() As NorthwindWithSprocs.SuppliersDataTable
        Return Adapter.GetSuppliers()
    End Function
    <System.ComponentModel.DataObjectMethodAttribute _
        (System.ComponentModel.DataObjectMethodType.Update, True)> _
    Public Function UpdateSupplier(companyName As String, contactName As String, _
        contactTitle As String, supplierID As Integer) As Boolean
        Dim suppliers As NorthwindWithSprocs.SuppliersDataTable = _
            Adapter.GetSupplierBySupplierID(supplierID)
        If suppliers.Count = 0 Then
            ' no matching record found, return false
            Return False
        End If
        Dim supplier As NorthwindWithSprocs.SuppliersRow = suppliers(0)
        supplier.CompanyName = companyName
        If contactName Is Nothing Then 
            supplier.SetContactNameNull() 
        Else 
            supplier.ContactName = contactName
        End If
        If contactTitle Is Nothing Then 
            supplier.SetContactTitleNull() 
        Else 
            supplier.ContactTitle = contactTitle
        End If
        ' Update the product record
        Dim rowsAffected As Integer = Adapter.Update(supplier)
        ' Return true if precisely one row was updated, otherwise false
        Return rowsAffected = 1
    End Function
End Class

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 aktualizují prostřednictvím volání metody DAL s GetSupplierBySupplierID(supplierID) . Potom aktualizuje CategoryNamevlastnosti , ContactNamea ContactTitle a potvrdí tyto změny do databáze zavoláním metody Data Access Layer a Update předáním upraveného SuppliersRow objektu.

Poznámka

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

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

Po přidání počítaného sloupce 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 vypočítaným sloupcem. Začněte otevřením ComputedColumns.aspx stránky ve AdvancedDAL složce a přetažením objektu GridView z panelu nástrojů na Designer. Nastavte vlastnost GridView na IDSuppliers a z její inteligentní značky vytvořte vazbu na nový objekt ObjectDataSource s názvem SuppliersDataSource. Nakonfigurujte ObjectDataSource tak, aby používal SuppliersBLLWithSprocs třídu, která jsme přidali zpět v kroku 6, a klikněte na Další.

Konfigurace objektu 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 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 Dokončit dokončete konfiguraci ObjectDataSource.

Po dokončení průvodce Konfigurací zdroje dat přidá Visual Studio pro každé vrácené datové pole BoundField. SupplierID Odeberte BoundField a změňte HeaderText vlastnosti CompanyNamepolí , ContactName, ContactTitlea FullContactName BoundFields na Společnost, Jméno kontaktu, Titul 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 GridView dokončení Průvodce zdrojem dat také způsobí, že Visual Studio nastaví vlastnost ObjectDataSource 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 jejich deklarativní kód měl vypadat nějak takto:

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

Potom přejděte na tuto stránku prostřednictvím prohlížeče. 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ím zbývající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í na tlačítko Upravit u konkrétního dodavatele způsobí zpětné odeslání a tento řádek se vykreslí ve svém rozhraní pro úpravy (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 nastavena na True hodnotu , FullContactName protože odpovídající FullContactName sloupec v objektu SuppliersDataTable má vlastnost ReadOnly nastavenou na True.ReadOnly Jak je uvedeno v kroku 4, FullContactName vlastnost s ReadOnly byla nastavena na hodnotu True , protože Objekt TableAdapter zjistil, že sloupec byl vypočítaný sloupec.

Sloupec FullContactName není možné upravovat.

Obrázek 13: Sloupec FullContactName nelze 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ž vede k výchozímu rozhraní pro úpravy. Vzhledem k tomu, že CompanyName je pole povinné, mělo by být převedeno na TemplateField, které obsahuje RequiredFieldValidator. Nechávám to jako cvičení pro čtenáře, který se o to zajímá. Podrobné pokyny k převodu 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 úprav 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ší tabulce TableAdapter k překonání křehkosti, která je spojená s sadou TableAdapter, které používají příkazy SQL ad hoc. Pokud průvodce TableAdapter vytvoří nové uložené procedury, je důležité, aby hlavní dotaz nejprve 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 libovolné počítané sloupce.

Všechno nejlepší na 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 zastihnout na mitchell@4GuysFromRolla.comadrese . nebo prostřednictvím jeho blogu, který najdete na adrese http://ScottOnWriting.NET.

Zvláštní poděkování

Tato série kurzů byla zkontrolována mnoha užitečnými recenzenty. Hlavními recenzenty pro tento kurz byly Hilton Geisenow a Teresa Murphy. Chtěli byste si projít své nadcházející články na webu MSDN? Pokud ano, dejte mi řádek na mitchell@4GuysFromRolla.com.