Práce s vypočítanými sloupci (C#)
Při vytváření databázové tabulky vám Microsoft SQL Server umožňuje definovat počítaný sloupec, jehož hodnota se počítá z výrazu, který obvykle odkazuje na jiné hodnoty ve stejném záznamu databáze. Tyto hodnoty jsou v databázi jen pro čtení, což vyžaduje zvláštní pozornost při práci s doplňky TableAdapter. V tomto kurzu se dozvíte, jak řešit problémy, které představují počítané sloupce.
Úvod
Microsoft SQL Server umožňuje používat počítané sloupce, což jsou sloupce, jejichž hodnoty se počítají z výrazu, který obvykle odkazuje na hodnoty z jiných sloupců ve stejné tabulce. Datový model sledování času může mít například tabulku s názvem ServiceLog
se sloupci ServicePerformed
, EmployeeID
, Rate
a Duration
. I když je možné částku splatnou na položku služby (sazbu vynásobenou dobou trvání) vypočítat prostřednictvím webové stránky nebo jiného programového rozhraní, může být užitečné zahrnout do ServiceLog
tabulky AmountDue
sloupec, který tyto informace ohlásil. Tento sloupec může být vytvořen jako normální sloupec, ale je potřeba ho aktualizovat při každé Rate
změně hodnot sloupců nebo Duration
. Lepším řešením by bylo vytvořit ze AmountDue
sloupce vypočítaný sloupec pomocí výrazu Rate * Duration
. Pokud byste to udělali, SQL Server automaticky vypočítali AmountDue
hodnotu sloupce pokaždé, když na ni v dotazu odkazujete.
Vzhledem k tomu, že hodnota vypočítaného sloupce je určená výrazem, jsou tyto sloupce jen pro čtení, a proto nemohou mít přiřazené hodnoty v INSERT
příkazech or UPDATE
. Pokud jsou ale počítané sloupce součástí hlavního dotazu pro objekt TableAdapter, který používá ad hoc příkazy SQL, automaticky se zahrnou do automaticky generovaných INSERT
příkazů a UPDATE
. V důsledku toho musí být objekty TableAdapter INSERT
a UPDATE
dotazy a InsertCommand
vlastnosti a aktualizovány UpdateCommand
tak, aby se odebraly odkazy na všechny počítané sloupce.
Jedním z výzev při použití počítaných sloupců s objektem TableAdapter, který používá ad hoc příkazy SQL, je, že se objekty TableAdapter INSERT
a UPDATE
dotazy automaticky vygenerují při každém dokončení průvodce konfigurací objektu TableAdapter. Proto se vypočítané sloupce ručně odebrané z INSERT
dotazů a UPDATE
znovu zobrazí, pokud průvodce znovu spustíte. I když objekty TableAdapter, které používají uložené procedury, touto křehkostí netrpí, mají své vlastní vlastnosti, které budeme řešit v kroku 3.
V tomto kurzu přidáme vypočítaný sloupec do Suppliers
tabulky v databázi Northwind a pak vytvoříme odpovídající objekt TableAdapter pro práci s touto tabulkou a jejím vypočítaným sloupcem. Náš tableAdapter bude používat uložené procedury místo ad-hoc příkazů SQL, aby se při použití Průvodce konfigurací tableAdapter neztratily naše vlastní nastavení.
Pusťme se do toho!
Krok 1: Přidání vypočítaného sloupce doSuppliers
tabulky
Databáze Northwind neobsahuje žádné počítané sloupce, takže je budeme muset přidat sami. Pro účely tohoto kurzu přidáme do Suppliers
tabulky počítaný sloupec s názvem FullContactName
, který vrátí jméno kontaktu, titul a společnost, pro kterou pracuje, v následujícím formátu: ContactName
(ContactTitle
, CompanyName
). Tento vypočítaný sloupec může být použit v sestavách při zobrazení informací o dodavatelích.
Začněte tím, že Suppliers
otevřete definici tabulky tak, že v Průzkumníku serveru kliknete pravým tlačítkem na Suppliers
tabulku a v místní nabídce zvolíte Otevřít definici tabulky. Zobrazí se sloupce tabulky a jejich vlastnosti, jako je datový typ, jestli jsou povolené NULL
atd. Pokud chcete přidat počítaný sloupec, začněte zadáním názvu sloupce do definice tabulky. Pak zadejte jeho výraz do textového pole (Vzorec) v části Specifikace vypočítaného sloupce v okno Vlastnosti sloupce (viz obrázek 1). Počítaný sloupec FullContactName
pojmenujte a použijte následující výraz:
ContactName + ' (' + CASE WHEN ContactTitle IS NOT NULL THEN
ContactTitle + ', ' ELSE '' END + CompanyName + ')'
Všimněte si, že řetězce je možné v SQL zřetězení použít operátor .+
Příkaz CASE
lze použít jako podmíněný v tradičním programovacím jazyce. Ve výše uvedeném výrazu CASE
lze příkaz číst takto: Pokud ContactTitle
není NULL
, výstupem ContactTitle
je hodnota zřetězená čárkou, jinak nevygeneruje nic. Další informace o užitečnosti příkazu najdete v CASE
tématu Příkazy SQLCASE
.
Poznámka
Místo toho, abychom zde použili CASE
příkaz, mohli jsme alternativně použít ISNULL(ContactTitle, '')
. ISNULL(checkExpression, replacementValue)
vrátí checkExpression , pokud není NULL, v opačném případě vrátí hodnotu replacementValue. I když v tomto případě bude fungovat buď nebo ISNULL
CASE
, existují složitější scénáře, ve kterých se flexibilita CASE
příkazu nedá shodovat s ISNULL
.
Po přidání tohoto počítaného sloupce by vaše obrazovka měla vypadat jako snímek obrazovky na obrázku 1.
Obrázek 1: Přidání počítaného sloupce s názvem FullContactName
do Suppliers
tabulky (kliknutím zobrazíte obrázek v plné velikosti)
Po pojmenování počítaného sloupce a zadání jeho výrazu uložte změny tabulky kliknutím na ikonu Uložit na panelu nástrojů, stisknutím kláves Ctrl+S nebo přechodem do nabídky Soubor a zvolením možnosti Uložit Suppliers
.
Uložení tabulky by mělo aktualizovat Průzkumníka serveru, včetně právě přidaného Suppliers
sloupce v seznamu sloupců tabulky. Výraz zadaný do textového pole (Vzorec) se navíc automaticky přizpůsobí ekvivalentnímu výrazu, který odstraní nepotřebné prázdné znaky, ohraničuje názvy sloupců do závorek ([]
) a obsahuje závorky, které explicitněji znázorňují pořadí operací:
(((([ContactName]+' (')+case when [ContactTitle] IS NOT NULL
then [ContactTitle]+', ' else '' end)+[CompanyName])+')')
Další informace o počítaných sloupcích v Microsoft SQL Server najdete v technické dokumentaci. Podrobné pokyny k vytváření počítaných sloupců najdete také v tématu Postupy: Určení vypočítaných sloupců.
Poznámka
Ve výchozím nastavení se počítané sloupce fyzicky neukládají do tabulky, ale místo toho se přepočítávají pokaždé, když se na tyto sloupce odkazuje v dotazu. Zaškrtnutím políčka Je trvalý ale můžete dát SQL Server pokyn, aby počítaný sloupec v tabulce fyzicky uložili. Tím umožníte vytvoření indexu pro vypočítaný sloupec, což může zlepšit výkon dotazů, které ve svých WHERE
klauzulích používají vypočítanou hodnotu sloupce. Další informace najdete v tématu Vytváření indexů ve vypočítaných sloupcích .
Krok 2: Zobrazení hodnot vypočítaných sloupců
Než začneme pracovat na vrstvě přístupu k datům, chvíli si zabereme zobrazení FullContactName
hodnot. V Průzkumníku serveru klikněte pravým tlačítkem na Suppliers
název tabulky a v místní nabídce zvolte Nový dotaz. Otevře se okno Dotazu, které nás vyzve k výběru tabulek, které se mají do dotazu zahrnout. Suppliers
Přidejte tabulku a klikněte na Zavřít. Dále zkontrolujte CompanyName
sloupce , ContactName
, ContactTitle
a FullContactName
z tabulky Suppliers (Dodavatelé). Nakonec kliknutím na ikonu červeného vykřičníku na panelu nástrojů spusťte dotaz a zobrazte výsledky.
Jak je znázorněno na obrázku 2, výsledky zahrnují FullContactName
, které vypisují CompanyName
sloupce , ContactName
a ContactTitle
ve formátu ldquo;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íSuppliersTableAdapter
do vrstvy přístupu k datům
Abychom mohli pracovat s informacemi o dodavateli v naší aplikaci, musíme nejprve vytvořit objekty TableAdapter a DataTable v dal. V ideálním případě by to bylo možné provést pomocí stejných jednoduchých kroků, které jste prozkoumali v předchozích kurzech. Práce s vypočítanými sloupci ale přináší několik vrásek, které si zaslouží diskuzi.
Pokud používáte objekt TableAdapter, který používá ad hoc příkazy SQL, můžete jednoduše zahrnout vypočítaný sloupec do hlavního dotazu objektu TableAdapter prostřednictvím Průvodce konfigurací objektu TableAdapter. Tím se ale automaticky vygenerují INSERT
příkazy a UPDATE
, které obsahují vypočítaný sloupec. Pokud se pokusíte spustit některou z těchto metod, SqlException
bude vyvolán operátor se zprávou Sloupec ColumnName nelze změnit, protože se jedná buď o počítaný sloupec, nebo je výsledkem operátoru UNION. INSERT
I když příkaz a UPDATE
lze ručně upravit pomocí objektů TableAdapter InsertCommand
a UpdateCommand
vlastností, při každém opětovném spuštění průvodce konfigurací objektu TableAdapter dojde ke ztrátě těchto přizpůsobení.
Vzhledem k křehkosti objektů TableAdapter, které používají příkazy SQL ad hoc, se při práci s počítanými sloupci doporučuje používat uložené procedury. Pokud používáte existující uložené procedury, jednoduše nakonfigurujte objekt TableAdapter, jak je popsáno v kurzu Použití existujících uložených procedur pro objekty TableAdapter typed dataset . Pokud však průvodce TableAdapter vytvoří uložené procedury za vás, je důležité nejprve vynechat všechny počítané sloupce z hlavního dotazu. Pokud do hlavního dotazu zahrnete počítaný sloupec, průvodce konfigurací objektu TableAdapter vás po dokončení upozorní, že nemůže vytvořit odpovídající uložené procedury. Stručně řečeno, musíme nejprve nakonfigurovat objekt TableAdapter pomocí počítaného hlavního dotazu bez sloupců a poté ručně aktualizovat odpovídající uloženou proceduru a objekt TableAdapter SelectCommand
tak, aby zahrnoval vypočítaný sloupec. Tento přístup se podobá postupu použitému v kurzu Aktualizace objektu TableAdapter na použitíJOIN
s .
Pro účely tohoto kurzu přidáme nový objekt TableAdapter a necháme ho automaticky vytvořit uložené procedury. V důsledku toho budeme muset nejprve vynechat FullContactName
vypočítaný sloupec z hlavního dotazu.
Začněte otevřením NorthwindWithSprocs
datové sady ve ~/App_Code/DAL
složce . Klikněte pravým tlačítkem na Designer a v místní nabídce zvolte, že chcete přidat nový objekt TableAdapter. Tím spustíte průvodce konfigurací tableAdapter. Zadejte databázi, ze které se mají dotazovat data (NORTHWNDConnectionString
z Web.config
), a klikněte na Další. Vzhledem k tomu, že jsme zatím nevytvořili žádné uložené procedury pro dotazování Suppliers
nebo úpravy tabulky, vyberte možnost Vytvořit nové uložené procedury, aby je průvodce vytvořil za nás a klikněte na Další.
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 zahrnovala tento sloupec v kroku 4.
SELECT SupplierID, CompanyName, ContactName, ContactTitle
FROM Suppliers
Po zadání hlavního dotazu a kliknutí na Další nám průvodce umožní pojmenovat čtyři uložené procedury, které vygeneruje. Tyto uložené procedury Suppliers_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. Nechte zaškrtnutá všechna tři políčka, ale přejmenujte metodu GetData
na GetSuppliers
. Dokončete průvodce kliknutím na Dokončit.
Obrázek 5: Přejmenujte metodu GetData
na GetSuppliers
(Kliknutím zobrazíte obrázek v plné velikosti)
Po kliknutí na Dokončit průvodce vytvoří čtyři uložené procedury a přidá do zadané datové sady TableAdapter a odpovídající datatable.
Krok 4: Zahrnutí vypočítaného sloupce do hlavního dotazu objektu TableAdapter
Teď musíme aktualizovat objekty TableAdapter a DataTable vytvořené v kroku 3 tak, aby zahrnovaly FullContactName
počítaný sloupec. To zahrnuje dva kroky:
- Aktualizuje se uložená
Suppliers_Select
procedura tak, aby vrátilaFullContactName
počítaný sloupec, a - Aktualizuje se tabulka DataTable tak, aby obsahovala odpovídající
FullContactName
sloupec.
Začněte tím, že přejdete do Průzkumníka serveru a přejdete k podrobnostem do složky Uložené procedury. Otevřete uloženou proceduru Suppliers_Select
SELECT
a aktualizujte dotaz tak, aby zahrnoval FullContactName
počítaný sloupec:
SELECT SupplierID, CompanyName, ContactName, ContactTitle, FullContactName
FROM Suppliers
Uložte změny uložené procedury kliknutím na ikonu Uložit na panelu nástrojů, stisknutím kláves Ctrl+S nebo výběrem možnosti Uložit Suppliers_Select
v nabídce Soubor.
Pak se vraťte do Designer DataSet, klikněte pravým tlačítkem na 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ím Průvodce konfigurací nástroje TableAdapter pro aktualizaci sloupců tabulky DataTable (kliknutím zobrazíte obrázek v plné velikosti)
Dokončete průvodce kliknutím na Dokončit. Tím se automaticky přidá odpovídající sloupec do SuppliersDataTable
. Průvodce objektem TableAdapter je dostatečně inteligentní, aby zjistil, že FullContactName
sloupec je počítaný sloupec, a proto je jen pro čtení. V důsledku toho nastaví vlastnost column s ReadOnly
na true
hodnotu . Pokud to chcete ověřit, vyberte sloupec z SuppliersDataTable
pole a pak přejděte na okno Vlastnosti (viz obrázek 7). Všimněte si FullContactName
, že sloupec s DataType
a MaxLength
vlastnosti jsou také nastaveny odpovídajícím způsobem.
Obrázek 7: Sloupec FullContactName
je označen jako Read-Only (kliknutím zobrazíte obrázek v plné velikosti)
Krok 5: PřidáníGetSupplierBySupplierID
metody do třídy TableAdapter
Pro účely tohoto kurzu vytvoříme stránku ASP.NET, která zobrazí dodavatele v aktualizovatelné mřížce. V minulých kurzech jsme aktualizovali jeden záznam z vrstvy obchodní logiky načtením tohoto konkrétního záznamu z dal jako datatable silného typu, aktualizací jeho vlastností a následným odesláním aktualizované tabulky DataTable zpět do dal, aby se změny rozšířily do databáze. Abychom mohli provést tento první krok – načtení aktualizovaného záznamu z DAL – musíme nejprve do dal přidat metodu GetSupplierBySupplierID(supplierID)
.
Klikněte pravým tlačítkem na SuppliersTableAdapter
položku v návrhu datové sady a v místní nabídce zvolte možnost Přidat dotaz. Stejně jako v kroku 3 nechte průvodce, aby pro nás vygeneroval novou uloženou proceduru výběrem možnosti Vytvořit novou uloženou proceduru (zpět na obrázku 3 najdete snímek obrazovky s tímto krokem průvodce). Vzhledem k tomu, že tato metoda vrátí záznam s více sloupci, označte, že chceme použít dotaz SQL, který je příkazEM SELECT, který vrací řádky, a klikněte na Tlačítko Další.
Obrázek 8: Zvolte možnost VYBRAT, která vrací řádky (kliknutím zobrazíte obrázek v plné velikosti)
Následující krok nás vyzve k zadání dotazu, který se má použít pro tuto metodu. Zadejte následující příkaz, který vrátí stejná datová pole jako hlavní dotaz, ale pro konkrétního dodavatele.
SELECT SupplierID, CompanyName, ContactName, ContactTitle, FullContactName
FROM Suppliers
WHERE SupplierID = @SupplierID
Další obrazovka nás vyzve, abychom pojmenovali uloženou proceduru, která se bude automaticky generovat. Pojmenujte tuto uloženou proceduru Suppliers_SelectBySupplierID
a klikněte na Další.
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
.
Obrázek 10: Pojmenujte metody FillBySupplierID
TableAdapter a GetSupplierBySupplierID
(Kliknutím zobrazíte obrázek v plné velikosti)
Dokončete průvodce kliknutím na Dokončit.
Krok 6: Vytvoření vrstvy obchodní logiky
Před vytvořením ASP.NET stránky, která používá počítaný sloupec vytvořený v kroku 1, musíme nejprve přidat odpovídající metody do BLL. Naše ASP.NET stránka, kterou vytvoříme v kroku 7, umožní uživatelům zobrazit a upravit dodavatele. Proto potřebujeme, aby naše společnost BLL poskytla minimálně metodu, jak získat všechny dodavatele, a jinou metodu pro aktualizaci konkrétního dodavatele.
Ve složce vytvořte nový soubor třídy s názvem SuppliersBLLWithSprocs
~/App_Code/BLL
a přidejte následující kód:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using NorthwindWithSprocsTableAdapters;
[System.ComponentModel.DataObject]
public class SuppliersBLLWithSprocs
{
private SuppliersTableAdapter _suppliersAdapter = null;
protected SuppliersTableAdapter Adapter
{
get
{
if (_suppliersAdapter == null)
_suppliersAdapter = new SuppliersTableAdapter();
return _suppliersAdapter;
}
}
[System.ComponentModel.DataObjectMethodAttribute
(System.ComponentModel.DataObjectMethodType.Select, true)]
public NorthwindWithSprocs.SuppliersDataTable GetSuppliers()
{
return Adapter.GetSuppliers();
}
[System.ComponentModel.DataObjectMethodAttribute
(System.ComponentModel.DataObjectMethodType.Update, true)]
public bool UpdateSupplier(string companyName, string contactName,
string contactTitle, int supplierID)
{
NorthwindWithSprocs.SuppliersDataTable suppliers =
Adapter.GetSupplierBySupplierID(supplierID);
if (suppliers.Count == 0)
// no matching record found, return false
return false;
NorthwindWithSprocs.SuppliersRow supplier = suppliers[0];
supplier.CompanyName = companyName;
if (contactName == null)
supplier.SetContactNameNull();
else
supplier.ContactName = contactName;
if (contactTitle == null)
supplier.SetContactTitleNull();
else
supplier.ContactTitle = contactTitle;
// Update the product record
int rowsAffected = Adapter.Update(supplier);
// Return true if precisely one row was updated, otherwise false
return rowsAffected == 1;
}
}
Stejně jako ostatní třídy BLL má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 aktualizuje prostřednictvím volání metody DAL s GetSupplierBySupplierID(supplierID)
. Potom aktualizuje CategoryName
vlastnosti , ContactName
a ContactTitle
a potvrdí tyto změny v databázi voláním metody Data Access Layer s Update
a předáním upraveného SuppliersRow
objektu.
Poznámka
S výjimkou SupplierID
a CompanyName
povolují hodnoty všechny sloupce v tabulce NULL
Dodavatelé. Proto pokud jsou parametry předané contactName
nebo contactTitle
musíme nastavit odpovídající ContactName
vlastnosti a ContactTitle
na NULL
hodnotu databáze pomocí SetContactNameNull
metod a SetContactTitleNull
.null
Krok 7: Práce s počítaným sloupcem z prezentační vrstvy
Po přidání počítaných sloupců do Suppliers
tabulky a odpovídajícím způsobem aktualizovaných dal a BLL jsme připraveni vytvořit ASP.NET stránku, která bude pracovat s FullContactName
počítaným sloupcem. Začněte tím, že ComputedColumns.aspx
otevřete stránku ve AdvancedDAL
složce a přetáhnete GridView z panelu nástrojů do Designer. Nastavte vlastnost GridView s ID
na Suppliers
a z její inteligentní značky ji vytvořte vazbu na nový ObjectDataSource s názvem SuppliersDataSource
. Nakonfigurujte ObjectDataSource tak, aby používal třídu, která SuppliersBLLWithSprocs
jsme přidali zpět v kroku 6, a klikněte na Další.
Obrázek 11: Konfigurace objektu ObjectDataSource pro použití SuppliersBLLWithSprocs
třídy (kliknutím zobrazíte obrázek v plné velikosti)
Ve třídě jsou definované SuppliersBLLWithSprocs
pouze dvě metody: GetSuppliers
a UpdateSupplier
. Ujistěte se, že tyto dvě metody jsou zadány na kartách SELECT a UPDATE v uvedeném pořadí, a kliknutím na Dokončit dokončete konfiguraci ObjectDataSource.
Po dokončení průvodce konfigurací zdroje dat přidá Visual Studio pro každé z vrácených datových polí BoundField. SupplierID
Odeberte BoundField a změňte HeaderText
vlastnosti CompanyName
, ContactName
, ContactTitle
a FullContactName
BoundFields na Společnost, Jméno kontaktu, Název a Celé jméno kontaktu. V inteligentní značce zaškrtněte políčko Povolit úpravy, abyste zapnuli integrované možnosti úprav GridView.
Kromě přidání BoundFields do objektu GridView dokončení Průvodce zdrojem dat také způsobí, že Visual Studio nastaví vlastnost ObjectDataSource s OldValuesParameterFormatString
na original_{0}. Vraťte toto nastavení zpět na výchozí hodnotu {0} .
Po provedení těchto úprav v objektech GridView a ObjectDataSource by měly jejich deklarativní značky vypadat podobně jako následující:
<asp:GridView ID="Suppliers" runat="server" AutoGenerateColumns="False"
DataKeyNames="SupplierID" DataSourceID="SuppliersDataSource">
<Columns>
<asp:CommandField ShowEditButton="True" />
<asp:BoundField DataField="CompanyName"
HeaderText="Company"
SortExpression="CompanyName" />
<asp:BoundField DataField="ContactName"
HeaderText="Contact Name"
SortExpression="ContactName" />
<asp:BoundField DataField="ContactTitle"
HeaderText="Title"
SortExpression="ContactTitle" />
<asp:BoundField DataField="FullContactName"
HeaderText="Full Contact Name"
SortExpression="FullContactName"
ReadOnly="True" />
</Columns>
</asp:GridView>
<asp:ObjectDataSource ID="SuppliersDataSource" runat="server"
SelectMethod="GetSuppliers" TypeName="SuppliersBLLWithSprocs"
UpdateMethod="UpdateSupplier">
<UpdateParameters>
<asp:Parameter Name="companyName" Type="String" />
<asp:Parameter Name="contactName" Type="String" />
<asp:Parameter Name="contactTitle" Type="String" />
<asp:Parameter Name="supplierID" Type="Int32" />
</UpdateParameters>
</asp:ObjectDataSource>
Dále přejděte na tuto stránku v prohlížeči. Jak ukazuje obrázek 12, každý dodavatel je uveden v mřížce, která obsahuje FullContactName
sloupec, jehož hodnota je jednoduše zřetězení ostatních tří sloupců formátovaných jako ContactName
(ContactTitle
, CompanyName
) .
Obrázek 12: Každý dodavatel je uvedený v mřížce (kliknutím zobrazíte obrázek v plné velikosti)
Kliknutím na tlačítko Upravit u konkrétního dodavatele dojde k zpětnému odeslání a v rozhraní pro úpravy se tento řádek vykreslí (viz obrázek 13). První tři sloupce se vykreslují ve svém výchozím rozhraní pro úpravy – ovládací prvek TextBox, jehož Text
vlastnost je nastavena na hodnotu datového pole. Sloupec FullContactName
ale zůstane jako text. Při přidání BoundFields do objektu GridView po dokončení průvodce konfigurací zdroje dat byla vlastnost BoundField s ReadOnly
nastavena natrue
, FullContactName
protože odpovídající FullContactName
sloupec v objektu SuppliersDataTable
má vlastnost ReadOnly
nastavenou na true
. Jak je uvedeno v kroku 4, FullContactName
vlastnost s ReadOnly
byla nastavena na true
, protože Objekt TableAdapter zjistil, že sloupec je počítaný sloupec.
Obrázek 13: Sloupec FullContactName
není možné upravovat (kliknutím zobrazíte obrázek v plné velikosti)
Pokračujte aktualizací hodnoty jednoho nebo více upravitelných sloupců a klikněte na Aktualizovat. Všimněte si, jak se FullContactName
hodnota s automaticky aktualizuje, aby odrážela změnu.
Poznámka
GridView aktuálně používá BoundFields pro upravitelná pole, což má za následek výchozí rozhraní pro úpravy. Vzhledem k tomu, že CompanyName
pole je povinné, mělo by být převedeno na TemplateFieldField, které obsahuje RequiredFieldValidator. Nechám to jako cvičení pro čtenáře, který má zájem. Podrobné pokyny k převodu BoundFieldu na TemplateField a přidání ověřovacích ovládacích prvků a přidání ověřovacích ovládacích prvků najdete v kurzu Přidání ověřovacích ovládacích prvků do kurzu Úpravy a vkládání rozhraní.
Souhrn
Při definování schématu pro tabulku microsoft SQL Server umožňuje zahrnutí počítaných sloupců. Jedná se o sloupce, jejichž hodnoty se počítají z výrazu, který obvykle odkazuje na hodnoty z jiných sloupců ve stejném záznamu. Vzhledem k tomu, že hodnoty počítaných sloupců jsou založené na výrazu, jsou jen pro čtení a nelze jim přiřadit hodnotu v INSERT
příkazu nebo UPDATE
. To přináší problémy při použití počítaného sloupce v hlavním dotazu objektu TableAdapter, který se pokouší automaticky vygenerovat odpovídající 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šem nástroji TableAdapter k překonání křehkosti, která je součástí objektů TableAdapter, které používají ad hoc příkazy SQL. Když průvodce TableAdapter vytvoří nové uložené procedury, je důležité, aby hlavní dotaz zpočátku vynechal všechny počítané sloupce, protože jejich přítomnost brání vygenerování uložených procedur úprav dat. Po počáteční konfiguraci objektu TableAdapter je možné jeho SelectCommand
uloženou proceduru změnit tak, aby zahrnovala všechny počítané sloupce.
Šťastné programování!
O autorovi
Scott Mitchell, autor sedmi knih o ASP/ASP.NET a zakladatel 4GuysFromRolla.com, pracuje s webovými technologiemi Microsoftu od roku 1998. Scott pracuje jako nezávislý konzultant, školitel a spisovatel. Jeho nejnovější kniha je Sams Teach Yourself ASP.NET 2.0 in 24 Hours. Můžete ho najít na mitchell@4GuysFromRolla.comadrese . nebo prostřednictvím jeho blogu, který najdete na http://ScottOnWriting.NETadrese .
Zvláštní poděkování
Tato série kurzů byla zkontrolována mnoha užitečnými recenzenty. Hlavními recenzenty tohoto kurzu byly Hilton Geisenow a Teresa Murphy. Chcete si projít moje nadcházející články na WEBU MSDN? Pokud ano, dejte mi čáru na mitchell@4GuysFromRolla.comadresu .
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