Práce s vypočítanými sloupci (C#)
Scott Mitchell
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
, Rate
a 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 doSuppliers
tabulky
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.
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
, ContactName
a ContactTitle
FullContactName
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í FullContactName
CompanyName
, ContactName
a ContactTitle
sloupce používající formát ldquo;ContactName
(ContactTitle
, CompanyName
) .
Obrázek 2: Použití FullContactName
formátu ContactName
(,CompanyName
) (ContactTitle
kliknutím zobrazíte obrázek v plné velikosti)
Krok 3: Přidání vrstvySuppliersTableAdapter
pří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ší.
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í SupplierID
sloupce , CompanyName
ContactName
a 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_Insert
a Suppliers_Delete
Suppliers_Update
, jak znázorňuje obrázek 4.
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.
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:
Suppliers_Select
Aktualizace uložené procedury tak, aby vrátilaFullContactName
vypočítaný sloupec, a- 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 SuppliersTableAdapter
polož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ů.
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.
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íGetSupplierBySupplierID
metody 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ší.
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ší.
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 GetSupplierBySupplierID
v uvedeném pořadí.
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
, ContactName
a 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ší.
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
, ContactTitle
a 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
).
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.
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
, UPDATE
a 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.