Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
által Scott Mitchell
Adatbázistábla létrehozásakor a Microsoft SQL Server lehetővé teszi, hogy olyan számított oszlopot definiáljon, amelynek értékét olyan kifejezésből számítja ki, amely általában ugyanazon adatbázisrekord más értékeire hivatkozik. Az ilyen jellegű értékek csak olvashatók az adatbázisban, ami speciális megfontolásokat igényel a TableAdapterek használatakor. Ebben az oktatóanyagban megtanuljuk, hogyan lehet megfelelni a számított oszlopok által támasztott kihívásoknak.
Bevezetés
A Microsoft SQL Server lehetővé teszi a számított oszlopokat, amelyek olyan oszlopok, amelyek értékeit olyan kifejezésből számítják ki, amely általában az ugyanazon tábla más oszlopaiból származó értékekre hivatkozik. Az időkövetési adatmodell például tartalmazhat egy ServiceLog
nevű táblát, amely a ServicePerformed
, EmployeeID
, Rate
, Duration
, és más oszlopokat foglal magában. Bár a szolgáltatáselemenként fizetendő összeg (mely a ráta és az időtartam szorzata) egy weblapon vagy más programfelületen kiszámítható, hasznos lehet egy ServiceLog
nevű oszlopot belefoglalni a AmountDue
táblázatba, amely ezt az információt tartalmazza. Ez az oszlop létrehozható normál oszlopként, de frissíteni kellene a Rate
vagy Duration
oszlop értékeinek bármilyen megváltozása esetén. A jobb módszer az lenne, ha az AmountDue
oszlopot számított oszlopként használná a kifejezés Rate * Duration
használatával. Ha így tesz, az SQL Server automatikusan kiszámítja az AmountDue
oszlop értékét, amikor egy lekérdezésben hivatkoznak rá.
Mivel egy számított oszlop értékét egy kifejezés határozza meg, az ilyen oszlopok írásvédettek, és ezért nem lehet értékeket hozzárendelni hozzájuk INSERT
vagy UPDATE
utasításokkal. Ha azonban a számított oszlopok az alkalmi SQL-utasításokat használó TableAdapter fő lekérdezésének részei, azok automatikusan bekerülnek az automatikusan létrehozott INSERT
és UPDATE
az utasításokba. Következésképpen a TableAdapter s INSERT
UPDATE
, valamint a lekérdezéseket és InsertCommand
UpdateCommand
tulajdonságokat frissíteni kell a számított oszlopokra mutató hivatkozások eltávolításához.
A számított oszlopok ad hoc SQL-utasításokat használó TableAdapterrel való használatának egyik kihívása, hogy a TableAdapter s INSERT
és UPDATE
a lekérdezések automatikusan újragenerálódnak a TableAdapter Konfiguráció varázsló befejezésekor. Ezért, ha a varázslót újra futtatjuk, a manuálisan eltávolított kiszámított oszlopok ismét megjelennek a INSERT
és UPDATE
lekérdezésekben. Bár a tárolt eljárásokat használó TableAdapterek nem szenvednek ettől a törékenységtől, a 3. lépésben ismertetett saját furcsaságokkal rendelkeznek.
Ebben az oktatóanyagban hozzáadunk egy számított oszlopot a Suppliers
Northwind-adatbázisban lévő táblához, majd létrehozunk egy megfelelő TableAdaptert a táblázat és a számított oszlop használatához. A TableAdapter ad-hoc SQL-utasítások helyett tárolt eljárásokat fog használni, hogy a TableAdapter Konfiguráció varázsló használatakor ne vesszenek el a testreszabások.
Lássunk hozzá!
1. lépés: Számított oszlop hozzáadása aSuppliers
táblához
A Northwind-adatbázis nem rendelkezik számított oszlopokkal, ezért saját magunk kell hozzáadnunk egyet. Ebben az oktatóanyagban adjunk hozzá egy számított oszlopot az Suppliers
úgynevezett FullContactName
táblához, amely visszaadja a partner nevét, címét és a vállalatot, amelynél a következő formátumban dolgoznak: ContactName
(ContactTitle
, CompanyName
). Ez a számított oszlop a jelentésekben használható a szállítókkal kapcsolatos információk megjelenítésekor.
Először nyissa meg a Suppliers
tábladefiníciót a Suppliers
táblára a Kiszolgálók böngészőjében jobb gombbal kattintva, majd a helyi menüben válassza a Tábladefiníció megnyitása parancsot. Ez megjeleníti a tábla oszlopait és tulajdonságaikat, például az adattípusukat, hogy engedélyezik-e a(z) NULL
elemet, és így tovább. Számított oszlop hozzáadásához először írja be az oszlop nevét a tábladefinícióba. Ezután írja be a kifejezést a (Képlet) szövegmezőbe az Oszloptulajdonságok ablak Számított oszlop specifikáció szakaszában (lásd az 1. ábrát). Nevezze el a számított oszlopot FullContactName
, és használja a következő kifejezést:
ContactName + ' (' + CASE WHEN ContactTitle IS NOT NULL THEN
ContactTitle + ', ' ELSE '' END + CompanyName + ')'
Vegye figyelembe, hogy a sztringek összefűzhetők az SQL-ben az +
operátor használatával. Az CASE
utasítás feltételesként használható egy hagyományos programozási nyelven. A fenti kifejezésben az CASE
utasítás a következőképpen olvasható: Ha ContactTitle
nem NULL
, akkor vesszővel összefűzött értéket ad ki ContactTitle
, ellenkező esetben semmit nem bocsát ki. Az utasítás hasznosságáról további információt az CASE
SQL-utasításokban CASE
talál.
Megjegyzés:
Ahelyett, hogy itt egy CASE
utasítást használunk, alternatívaként használhattuk volna a ISNULL(ContactTitle, '')
-t.
ISNULL(checkExpression, replacementValue)
a checkExpression értéket adja vissza, ha nem NULL értékű, ellenkező esetben a replacementValue értéket adja vissza. Bár ebben az esetben a ISNULL
vagy a CASE
is működni fog, vannak bonyolultabb forgatókönyvek, ahol a CASE
utasítás rugalmassága páratlan a ISNULL
által.
A számított oszlop hozzáadása után a képernyőnek úgy kell kinéznie, mint az 1. ábrán látható képernyőkép.
1. ábra: Számított oszlop FullContactName
hozzáadása a táblához (Suppliers
teljes méretű képet)
Miután elnevezte a számított oszlopot, és megadta a kifejezését, mentse a módosításokat a táblázatba az eszköztár Mentés ikonra kattintva, a Ctrl+S billentyűkombináció lenyomásával, vagy a Fájl menüben a Mentés Suppliers
gombra kattintva.
A tábla mentésekor frissítenie kell a Kiszolgálókezelőt, beleértve az imént hozzáadott oszlopot is a Suppliers
tábla oszloplistájában. Ezenkívül a (Képlet) szövegmezőbe beírt kifejezés automatikusan igazodik egy egyenértékű kifejezéshez, amely szükségtelen szóközöket csíkoz, szögletes zárójelekkel ([]
) veszi körül az oszlopneveket, és zárójeleket tartalmaz a műveletek sorrendjének pontosabb megjelenítéséhez:
(((([ContactName]+' (')+case when [ContactTitle] IS NOT NULL
then [ContactTitle]+', ' else '' end)+[CompanyName])+')')
A Microsoft SQL Server számítási oszlopokkal kapcsolatos további információiért tekintse meg a műszaki dokumentációt. Tekintse meg a Számítási oszlopok megadása című témakört is, amely részletesen ismerteti a számított oszlopok létrehozását.
Megjegyzés:
Alapértelmezés szerint a számított oszlopok fizikailag nem a táblában vannak tárolva, hanem újraszámítanak minden alkalommal, amikor egy lekérdezésben hivatkoznak rájuk. Az Is Persisted jelölőnégyzet bejelölésével azonban utasíthatja az SQL Servert, hogy fizikailag tárolja a számított oszlopot a táblában. Ezzel lehetővé teszi egy index létrehozását a számított oszlopon, amely javíthatja a kikötésekben WHERE
a számított oszlop értékét használó lekérdezések teljesítményét. További információ: Indexek létrehozása számított oszlopokon .
2. lépés: A számított oszlop értékeinek megtekintése
Mielőtt elkezdenénk dolgozni az adatelérési rétegen, szánjunk egy percet az FullContactName
értékek megtekintésére. A Kiszolgálókezelőben kattintson a jobb gombbal a Suppliers
tábla nevére, és válassza az Új lekérdezés lehetőséget a helyi menüből. Ekkor megjelenik egy lekérdezési ablak, amely arra kéri, hogy válasszuk ki a lekérdezésbe felvenni kívánt táblákat. Adja hozzá a táblázatot, és kattintson a Suppliers
Bezárás gombra. Ezután ellenőrizze a Szállítók tábla CompanyName
, ContactName
, ContactTitle
, és FullContactName
oszlopait. Végül kattintson a piros felkiáltójel ikonra az eszköztárban a lekérdezés végrehajtásához és az eredmények megtekintéséhez.
Ahogy a 2. ábra mutatja, az eredmények a FullContactName
tartalmazzák, amely felsorolja a CompanyName
, ContactName
és ContactTitle
oszlopokat a ContactName
formátumot használva (ContactTitle
, CompanyName
).
2. ábra: A FullContactName
formátum ContactName
(ContactTitle
, CompanyName
) használata (ide kattintva megtekintheti a teljes méretű képet)
3. lépés: Az adatelérésiSuppliersTableAdapter
réteg hozzáadása
Ahhoz, hogy együttműködhessünk az alkalmazás szállítói adataival, először létre kell hoznunk egy TableAdaptert és DataTable-t a DAL-ban. Ideális esetben ez a korábbi oktatóanyagokban ismertetett egyszerű lépések végrehajtásával valósítható meg. A számított oszlopokkal való munka azonban néhány ráncot tartalmaz, amelyek megvitatásra érdemesek.
Ha olyan TableAdaptert használ, amely alkalmi SQL-utasításokat használ, egyszerűen felveheti a számított oszlopot a TableAdapter fő lekérdezésbe a TableAdapter Konfiguráció varázslójával. Ez azonban automatikusan létrehoz olyan INSERT
és UPDATE
utasításokat, amelyek tartalmazzák a számított oszlopot. Ha megkísérli végrehajtani az egyik metódust, SqlException
a következő üzenet jelenik meg: A ColumnName oszlop nem módosítható, mert az vagy számított oszlop, vagy egy UNION operátor eredménye lesz. Bár a INSERT
és UPDATE
utasítás manuálisan módosítható a TableAdapter InsertCommand
és UpdateCommand
tulajdonságai használatával, ezek a testreszabások elvesznek, amikor a TableAdapter konfigurációs varázsló újra fut.
Az alkalmi SQL-utasításokat használó TableAdapters törékenysége miatt ajánlott tárolt eljárásokat használni a számított oszlopok használatakor. Ha meglévő tárolt eljárásokat használ, egyszerűen konfigurálja a TableAdaptert a Typed DataSet s TableAdapters oktatóanyag Meglévő tárolt eljárások használata című oktatóanyagában leírtak szerint. Ha a TableAdapter varázslót használja a tárolt eljárások létrehozásához, fontos azonban, hogy kezdetben hagyja ki a számított oszlopokat a fő lekérdezésből. Ha egy számított oszlopot ad a fő lekérdezéshez, a TableAdapter Configuration varázsló a befejezés után tájékoztatja arról, hogy nem tudja létrehozni a hozzá tartozó tárolt eljárásokat. Röviden: először konfigurálnunk kell a TableAdaptert egy számított oszlopmentes fő lekérdezés használatával, majd manuálisan frissíteni kell a megfelelő tárolt eljárást, és a TableAdapter s-t SelectCommand
, hogy belefoglaljuk a számított oszlopot. Ez a megközelítés hasonló a TableAdapter to UseJOIN
oktatóanyagban használthoz.
Ebben az oktatóanyagban adjunk hozzá egy új TableAdaptert, és hozzuk létre automatikusan a tárolt eljárásokat. Ezért először ki kell hagynunk a FullContactName
számított oszlopot a fő lekérdezésből.
Először nyissa meg a NorthwindWithSprocs
DataSetet a ~/App_Code/DAL
mappában. Kattintson a jobb gombbal a Tervező elemre, és a helyi menüből válassza az új TableAdapter hozzáadását. Ezzel elindítja a TableAdapter Configuration varázslót. Adja meg azt az adatbázist, amelyből adatokat szeretne lekérdezni (NORTHWNDConnectionString
innen), Web.config
majd kattintson a Tovább gombra. Mivel még nem hoztunk létre tárolt eljárásokat a Suppliers
tábla lekérdezéséhez vagy módosításához, válassza az Új tárolt eljárások létrehozása lehetőséget, hogy a varázsló létrehozza őket, és kattintson a Tovább gombra.
3. ábra: Válassza az Új tárolt eljárások létrehozása lehetőséget (kattintson ide a teljes méretű kép megtekintéséhez)
A következő lépésben a fő lekérdezésre van szükség. Adja meg a következő lekérdezést, amely az SupplierID
, CompanyName
, ContactName
és ContactTitle
oszlopokat adja vissza az egyes szállítókhoz. Vegye figyelembe, hogy ez a lekérdezés szándékosan kihagyja a számított oszlopot (FullContactName
); a megfelelő tárolt eljárást frissítjük, hogy belefoglaljuk ezt az oszlopot a 4. lépésbe.
SELECT SupplierID, CompanyName, ContactName, ContactTitle
FROM Suppliers
Miután beírta a fő lekérdezést, és a Tovább gombra kattintott, a varázsló lehetővé teszi a generált négy tárolt eljárás elnevezését. Nevezze el ezeket a tárolt eljárásokat Suppliers_Select
, Suppliers_Insert
Suppliers_Update
és Suppliers_Delete
, ahogy a 4. ábra szemlélteti.
4. ábra: Az automatikusan létrehozott tárolt eljárások nevének testreszabása (kattintson ide a teljes méretű kép megtekintéséhez)
A következő varázslólépés lehetővé teszi a TableAdapter metódusainak elnevezését, valamint az adatok eléréséhez és frissítéséhez használt minták megadását. Hagyja bejelölve mindhárom jelölőnégyzetet, de nevezze át a GetData
metódust GetSuppliers
névre. A varázsló befejezéséhez kattintson a Befejezés gombra.
5. ábra: Nevezze át a GetData
metódust a következőre GetSuppliers
(kattintson ide a teljes méretű kép megtekintéséhez)
A Befejezés gombra kattintva a varázsló létrehozza a négy tárolt eljárást, és hozzáadja a TableAdaptert és a hozzá tartozó DataTable-t a Gépelt adatkészlethez.
4. lépés: A Számított oszlop beleszámolása a TableAdapter fő lekérdezésében
Most frissíteni kell a 3. lépésben létrehozott TableAdapter és DataTable táblát, hogy belefoglaljuk a FullContactName
számított oszlopot. Ez két lépésből áll:
- A tárolt eljárás frissítése a
Suppliers_Select
FullContactName
számított oszlop visszaadásához, és - A DataTable frissítése, hogy tartalmazzon egy megfelelő
FullContactName
oszlopot.
Először navigáljon a Kiszolgálókezelőre, és fúrjon le a Tárolt eljárások mappába. Nyissa meg a Suppliers_Select
tárolt eljárást, és frissítse a SELECT
lekérdezést úgy, hogy tartalmazza a FullContactName
számított oszlopot:
SELECT SupplierID, CompanyName, ContactName, ContactTitle, FullContactName
FROM Suppliers
Mentse a tárolt eljárás módosításait az eszköztár Mentés ikonra kattintva, a Ctrl+S billentyűkombináció lenyomásával vagy a Fájl menü Mentés Suppliers_Select
lehetőségével.
Ezután térjen vissza a DataSet Designerhez, kattintson a jobb gombbal a SuppliersTableAdapter
elemre, és válassza a Konfigurálás parancsot a helyi menüben. Vegye figyelembe, hogy az Suppliers_Select
oszlop most már tartalmazza a FullContactName
oszlopot az Adatoszlopok gyűjteményében.
6. ábra: Futtassa a TableAdapter konfigurációs varázslóját a DataTable oszlopainak frissítéséhez (kattintson ide a teljes méretű kép megtekintéséhez)
A varázsló befejezéséhez kattintson a Befejezés gombra. Ez automatikusan hozzáad egy megfelelő oszlopot a SuppliersDataTable
. A TableAdapter varázsló elég intelligens ahhoz, hogy észlelje, hogy az FullContactName
oszlop számított oszlop, ezért írásvédett. Ennek következtében beállítja az oszlop ReadOnly
tulajdonságát true
értékre. Ennek ellenőrzéséhez jelölje ki az oszlopot a SuppliersDataTable
Tulajdonságok ablakból (lásd a 7. ábrát). Vegye figyelembe, hogy az FullContactName
s DataType
oszlop és MaxLength
a tulajdonságok is ennek megfelelően vannak beállítva.
7. ábra: Az FullContactName
oszlop Read-Only van megjelölve (kattintson ide a teljes méretű kép megtekintéséhez)
5. lépés: Metódus hozzáadásaGetSupplierBySupplierID
a TableAdapterhez
Ebben az oktatóanyagban létrehozunk egy ASP.NET oldalt, amely egy frissíthető rácson jeleníti meg a szállítókat. A korábbi oktatóanyagokban egyetlen rekordot frissítettünk az üzleti logikai rétegből úgy, hogy lekértük az adott rekordot a DAL-ból erősen gépelt DataTable-ként, frissítettük annak tulajdonságait, majd visszaküldtük a frissített DataTable-t a DAL-nak, hogy propagálja a módosításokat az adatbázisba. Az első lépés végrehajtásához – a frissített rekord lekéréséhez a DAL-ból – először hozzá kell adnunk egy GetSupplierBySupplierID(supplierID)
metódust a DAL-hoz.
Kattintson a jobb gombbal a SuppliersTableAdapter
DataSet Design elemére, és válassza a Lekérdezés hozzáadása lehetőséget a helyi menüből. Ahogyan a 3. lépésben is, a varázsló új tárolt eljárást hozhat létre számunkra az Új tárolt eljárás létrehozása lehetőség kiválasztásával (a varázsló lépésének képernyőképét a 3. ábrán tekintheti meg). Mivel ez a metódus több oszlopból álló rekordot ad vissza, azt jelzi, hogy olyan SQL-lekérdezést szeretnénk használni, amely egy SELECT, amely sorokat ad vissza, és kattintson a Tovább gombra.
8. ábra: Válassza ki a sorokat visszajelölő SELECT lehetőséget (kattintson ide a teljes méretű kép megtekintéséhez)
A következő lépés arra kér minket, hogy adjuk meg a módszer használatához szükséges lekérdezést. Adja meg a következőket, amely ugyanazokat az adatmezőket adja vissza, mint a fő lekérdezés, de egy adott szállító esetében.
SELECT SupplierID, CompanyName, ContactName, ContactTitle, FullContactName
FROM Suppliers
WHERE SupplierID = @SupplierID
A következő képernyő arra kéri, hogy nevezzük el az automatikusan generált tárolt eljárást. Nevezze el ezt a tárolt eljárást Suppliers_SelectBySupplierID
, és kattintson a Tovább gombra.
9. ábra: A tárolt eljárás Suppliers_SelectBySupplierID
elnevezése (kattintson ide a teljes méretű kép megtekintéséhez)
Végül a varázsló kéri a TableAdapter adathozzáférési mintáit és metódusneveit. Hagyja bejelölve mindkét jelölőnégyzetet, de nevezze át a FillBy
metódust GetDataBy
-re, és a FillBySupplierID
metódust GetSupplierBySupplierID
-re.
10. ábra: Nevezze el a TableAdapter metódusokat FillBySupplierID
és GetSupplierBySupplierID
(kattintson ide a teljes méretű kép megtekintéséhez)
A varázsló befejezéséhez kattintson a Befejezés gombra.
6. lépés: Az üzleti logikai réteg létrehozása
Mielőtt létrehoznánk egy ASP.NET lapot, amely az 1. lépésben létrehozott számított oszlopot használja, először hozzá kell adnunk a megfelelő metódusokat a BLL-ben. A 7. lépésben létrehozott ASP.NET lap lehetővé teszi a felhasználók számára a szállítók megtekintését és szerkesztését. Ezért a BLL-nek legalább egy olyan módszert kell biztosítania, amely az összes szállítót lekéri, egy másikat pedig egy adott szállító frissítésére.
Hozzon létre egy új osztályfájlt SuppliersBLLWithSprocs
a ~/App_Code/BLL
mappában, és adja hozzá a következő kódot:
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
A többi BLL-osztályhoz hasonlóan a SuppliersBLLWithSprocs
rendelkezik egy Protected
Adapter
tulajdonsággal, amely visszaadja a SuppliersTableAdapter
osztály egy példányát, valamint két Public
metódust: GetSuppliers
és UpdateSupplier
. A GetSuppliers
metódus meghívja és visszaadja a SuppliersDataTable
megfelelő GetSupplier
metódus által visszaadott adatokat az adatelérési rétegben. A UpdateSupplier
metódus a GetSupplierBySupplierID(supplierID)
metódusának hívásával lekéri az aktualizált szállítóra vonatkozó információkat a DAL-tól. Ezután frissíti a CategoryName
, , ContactName
és ContactTitle
tulajdonságokat, és véglegesíti ezeket a módosításokat az adatbázisban az adatelérési réteg s Update
metódusának meghívásával, a módosított SuppliersRow
objektum átadásával.
Megjegyzés:
A Szállítók tábla SupplierID
és CompanyName
kivételével minden oszlopa engedélyezi a NULL
értékeket. Ezért ha az átadott contactName
vagy contactTitle
paraméterek Nothing
, a megfelelő ContactName
és ContactTitle
tulajdonságokat NULL
adatbázis-értékre kell állítani a SetContactNameNull
és SetContactTitleNull
metódusok használatával, megfelelően.
7. lépés: A számítási oszlop használata a bemutatórétegből
A számított oszlop hozzáadásával a Suppliers
táblázathoz, és a DAL és a BLL ennek megfelelően frissítésével készen állunk egy ASP.NET weboldal létrehozására, amely a FullContactName
számított oszloppal működik. Először nyissa meg a ComputedColumns.aspx
lapot a AdvancedDAL
mappában, és húzzon egy GridView-t az eszközkészletből a Tervezőbe. Állítsa be a GridView ID
tulajdonságát Suppliers
értékre, és intelligens címkéjével kösse hozzá egy új, SuppliersDataSource
nevű ObjectDataSource-hoz. Konfigurálja az ObjectDataSource-t a SuppliersBLLWithSprocs
6. lépésben hozzáadott osztály használatára, és kattintson a Tovább gombra.
11. ábra: Az ObjectDataSource konfigurálása az SuppliersBLLWithSprocs
osztály használatára (kattintson ide a teljes méretű kép megtekintéséhez)
Az osztályban SuppliersBLLWithSprocs
csak két metódus van definiálva: GetSuppliers
és UpdateSupplier
. Győződjön meg arról, hogy ez a két metódus meg van adva a SELECT és a UPDATE lapon, majd kattintson a Befejezés gombra az ObjectDataSource konfigurációjának befejezéséhez.
Az Adatforrás konfigurációja varázsló befejezése után a Visual Studio minden visszaadott adatmezőhöz hozzáad egy BoundFieldet. Távolítsa el a SupplierID
BoundFieldet, és módosítsa a HeaderText
, CompanyName
, ContactName
, ContactTitle
, és FullContactName
BoundFields tulajdonságait Cég, Kapcsolattartó neve, Beosztás és Teljes kapcsolattartó név értékekre. Az intelligens címkén jelölje be a Szerkesztés engedélyezése jelölőnégyzetet a GridView beépített szerkesztési képességeinek bekapcsolásához.
A BoundFields rácsnézethez való hozzáadása mellett az Adatforrás varázsló befejezése azt is eredményezi, hogy a Visual Studio az ObjectDataSource tulajdonságot original_OldValuesParameterFormatString
értékre állítja{0}. Állítsa vissza ezt a beállítást az alapértelmezett értékre. {0}
A GridView és az ObjectDataSource szerkesztése után a deklaratív korrektúra a következőhöz hasonlóan néz ki:
<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>
Ezután látogasson el erre a lapra egy böngészőben. Ahogy a 12. ábrán látható, minden szállító szerepel egy olyan rácsban, amely tartalmazza az FullContactName
oszlopot, amelynek értéke egyszerűen a másik három oszlop összefűzése, ContactName
(ContactTitle
, CompanyName
) formátumban.
12. ábra: Minden szállító szerepel a rácson (kattintson ide a teljes méretű kép megtekintéséhez)
Ha egy adott szállító Szerkesztés gombjára kattint, az visszalépést okoz, és a sor a szerkesztőfelületen jelenik meg (lásd a 13. ábrát). Az első három oszlop az alapértelmezett szerkesztőfelületen jelenik meg – egy TextBox-vezérlő, amelynek Text
tulajdonsága az adatmező értékére van állítva. Az FullContactName
oszlop azonban szövegként marad. Amikor az Adatforrás-konfiguráció varázsló befejezésekor a BoundFields hozzá lett adva a GridView-hoz, a FullContactName
BoundField tulajdonsága ReadOnly
azért lett beállítvaTrue
, mert a FullContactName
megfelelő SuppliersDataTable
oszlopának tulajdonsága ReadOnly
True
van állítva. A 4. lépésben leírtak szerint az FullContactName
s ReadOnly
tulajdonság azért lett beállítva True
, mert a TableAdapter azt észlelte, hogy az oszlop számított oszlop.
13. ábra: Az FullContactName
oszlop nem szerkeszthető (ide kattintva megtekintheti a teljes méretű képet)
Frissítse egy vagy több szerkeszthető oszlop értékét, és kattintson a Frissítés gombra. Figyelje meg, hogyan frissül automatikusan az FullContactName
s érték a változásnak megfelelően.
Megjegyzés:
A GridView jelenleg a BoundFieldst használja a szerkeszthető mezőkhöz, ami az alapértelmezett szerkesztőfelületet eredményezi. Mivel a CompanyName
mező megadása kötelező, sablonmezővé kell konvertálni, amely tartalmaz egy RequiredFieldValidatort. Ezt egy gyakorlatként hagyom az érdeklődő olvasónak. A BoundField sablonmezővé alakításához és érvényesítési vezérlők hozzáadásához szükséges lépésekért tekintse meg a Validation Controls hozzáadása a szerkesztési és beszúrási felületekhez című oktatóanyagot.
Összefoglalás
A tábla sémájának meghatározásakor a Microsoft SQL Server lehetővé teszi a számított oszlopok felvételét. Ezek olyan oszlopok, amelyek értékeit olyan kifejezésből számítjuk ki, amely általában az ugyanazon rekord más oszlopaiból származó értékekre hivatkozik. Mivel a számított oszlopok értékei kifejezésen alapulnak, írásvédettek, és nem rendelhetők hozzájuk érték sem egy INSERT
, sem egy UPDATE
utasításban. Ez kihívást jelent, ha egy számított oszlopot használ egy TableAdapter fő lekérdezésében, amely automatikusan megpróbál megfelelő INSERT
, UPDATE
és DELETE
utasítások létrehozására.
Ebben az oktatóanyagban a számítási oszlopok által támasztott kihívások megkerülésére szolgáló technikákat tárgyaltuk. A TableAdapterben tárolt eljárásokat használtunk a TableAdaptersben rejlő törékenység leküzdéséhez, amelyek alkalmi SQL-utasításokat használnak. Amikor a TableAdapter varázsló új tárolt eljárásokat hoz létre, fontos, hogy a fő lekérdezés kezdetben kihagyja a számított oszlopokat, mert jelenlétük megakadályozza a tárolt adatmódosítási eljárások létrehozását. A TableAdapter kezdeti konfigurálása után a tárolt eljárás újrarendelhető úgy, SelectCommand
hogy a számított oszlopokat is tartalmazza.
Boldog programozást!
Tudnivalók a szerzőről
Scott Mitchell, hét ASP/ASP.NET-könyv szerzője és a 4GuysFromRolla.com alapítója, 1998 óta dolgozik a Microsoft webtechnológiáival. Scott független tanácsadóként, edzőként és íróként dolgozik. Legújabb könyve Sams Tanuld meg ASP.NET 2.0 24 óra alatt. Ő itt elérhető mitchell@4GuysFromRolla.com.
Külön köszönet
Ezt az oktatóanyag-sorozatot sok hasznos véleményező áttekintette. Az oktatóanyag vezető véleményezői Hilton Geisenow és Teresa Murphy voltak. Szeretné áttekinteni a közelgő MSDN-cikkeimet? Ha igen, írj egy sort a mitchell@4GuysFromRolla.com-ra.