Práce s vypočítanými sloupci (VB)
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
, EmployeeID
Rate
, 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 doSuppliers
tabulky
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 ISNULL
CASE
bude, existují složitější scénáře, kdy se flexibilita CASE
příkazu nemůže shodovat pomocí ISNULL
příkazu .
Po přidání tohoto počítaný sloupec by měla obrazovka vypadat jako snímek obrazovky na obrázku 1.
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 CompanyName
sloupce , ContactName
, ContactTitle
a 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í CompanyName
sloupce , ContactName
a ContactTitle
ve formátu 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í doSuppliersTableAdapter
vrstvy 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íJOIN
s .
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ší.
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í SupplierID
sloupce , CompanyName
ContactName
, 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_Select
pojmenujte , Suppliers_Insert
, Suppliers_Update
a Suppliers_Delete
, jak je znázorněno na obrázku 4.
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.
Obrázek 5: Přejmenování metody na GetData
GetSuppliers
(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:
Suppliers_Select
Aktualizace uložené procedury tak, aby vrátilaFullContactName
vypočítaný sloupec, a- 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_Select
SELECT
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 SuppliersTableAdapter
a v místní nabídce zvolte Konfigurovat. Všimněte si Suppliers_Select
, že sloupec teď obsahuje FullContactName
sloupec v kolekci Sloupce dat.
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 ReadOnly
true
hodnotu . 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.
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íGetSupplierBySupplierID
metody 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ší.
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ší.
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
v uvedeném pořadí.
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áAdapter
Protected
vlastnost, 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 CategoryName
vlastnosti , ContactName
a 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 CompanyName
povolují 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 ID
Suppliers
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ší.
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 CompanyName
polí , ContactName
, ContactTitle
a 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
) .
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.
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í INSERT
příkazy , UPDATE
a 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.
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro