Megosztás a következőn keresztül:


Számítási oszlopok használata (VB)

által Scott Mitchell

PDF letöltése

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 * Durationhaszná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 INSERTUPDATE, valamint a lekérdezéseket és InsertCommandUpdateCommand 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 aSupplierstá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 CASESQL-utasításokban CASEtalá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.

FullContactName nevű számított oszlop hozzáadása a Szállítók táblához

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 Suppliersgombra 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).

A FullContactName a ContactName formátumot használja (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ésiSuppliersTableAdapterré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 UseJOINoktató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.configmajd 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.

Válassza az Új tárolt eljárások létrehozása lehetőséget

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_InsertSuppliers_Updateés Suppliers_Delete, ahogy a 4. ábra szemlélteti.

Az automatikusan létrehozott tárolt eljárások nevének testreszabása

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.

GetData metódus átnevezése GetSuppliersre

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:

  1. A tárolt eljárás frissítése a Suppliers_SelectFullContactName számított oszlop visszaadásához, és
  2. 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 SuppliersTableAdapterelemre, é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.

Futtassa a TableAdapter konfigurációs varázslóját a DataTable oszlopainak frissítéséhez

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.

A FullContactName oszlop írásvédettként meg van jelölve

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ásaGetSupplierBySupplierIDa 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.

Válassza ki azt a SELECT elemet, amely sorokat ad vissza.

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.

A tárolt eljárás elnevezése Suppliers_SelectBySupplierID

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.

Nevezze el a TableAdapter metódusokat FillBySupplierID és GetSupplierBySupplierID

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

Az ObjectDataSource konfigurálása a SuppliersBLLWithSprocs osztály használatára

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.

Minden szállító szerepel a táblázatban

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

A FullContactName oszlop nem szerkeszthető

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.