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


Az adatelérési réteg kapcsolat- és Command-Level beállításainak (VB) konfigurálása

által Scott Mitchell

PDF letöltése

A tipizált adathalmaz táblaadapterei automatikusan gondoskodnak az adatbázishoz való csatlakozásról, a parancsok kiadásáról és a DataTable feltöltéséről az eredményekkel. Vannak azonban olyan esetek, amikor mi magunk szeretnénk gondoskodni ezekről a részletekről, és ebben az oktatóanyagban megtanuljuk, hogyan érheti el az adatbázis kapcsolati és parancsszintű beállításait a TableAdapterben.

Bevezetés

Az oktatóanyag-sorozat során gépelt adathalmazokat használtunk a rétegzett architektúra adatelérési rétegének és üzleti objektumainak implementálásához. Az első oktatóanyagban ismertetett módon a Typed DataSet s DataTables adattárként szolgál, míg a TableAdapters burkolóként működik az adatbázissal való kommunikációhoz az alapul szolgáló adatok lekéréséhez és módosításához. A TableAdapters magában foglalja az adatbázissal végzett munka összetettségét, és nem kell kódot írnia az adatbázishoz való csatlakozáshoz, egy parancs kiadásához vagy az eredmények datatable-ba való feltöltéséhez.

Vannak azonban olyan időszakok, amikor a TableAdapter mélységébe kell beásnunk, és olyan kódot kell írnunk, amely közvetlenül a ADO.NET objektumokkal működik. A Tranzakció oktatóanyag burkolóadatbázis-módosításaiban például metódusokat adtunk hozzá a TableAdapterhez ADO.NET tranzakciók megkezdéséhez, véglegesítéséhez és visszaállításához. Ezek a metódusok egy belső, manuálisan létrehozott SqlTransaction objektumot használtak, amelyet a TableAdapter objektumaihoz SqlCommand rendeltek.

Ebben az oktatóanyagban azt vizsgáljuk meg, hogyan érheti el az adatbázis kapcsolati és parancsszintű beállításait a TableAdapterben. Különösen a ProductsTableAdapter-hoz új funkciókat adunk hozzá, amelyek lehetővé teszik a kapcsolati sztringhez és a parancs időtúllépési beállításaihoz való hozzáférést.

Adatok használata ADO.NET használatával

A Microsoft .NET-keretrendszer számos olyan osztályt tartalmaz, amelyeket kifejezetten az adatok kezeléséhez terveztek. Ezeket a System.Data névtérben található osztályokat ADO.NET osztályoknak nevezzük. Az ADO.NET esernyő egyes osztályai egy adott adatszolgáltatóhoz vannak kötve. Az adatszolgáltatót olyan kommunikációs csatornának tekintheti, amely lehetővé teszi az információk áramlását a ADO.NET osztályok és a mögöttes adattár között. Vannak olyan általánosított szolgáltatók, mint az OleDb és az ODBC, valamint olyan szolgáltatók, amelyeket kifejezetten egy adott adatbázisrendszerhez terveztek. Bár például OleDb-szolgáltatóval lehet csatlakozni egy Microsoft SQL Server-adatbázishoz, az SQLClient-szolgáltató sokkal hatékonyabb, mivel kifejezetten az SQL Serverhez lett tervezve és optimalizálva.

Az adatok programozott elérésekor gyakran a következő mintát használják:

  1. Hozzon létre kapcsolatot az adatbázissal.
  2. Adjon ki egy parancsot.
  3. Lekérdezések esetén SELECT az eredményként kapott rekordokkal dolgozzon.

Az egyes lépések végrehajtásához külön ADO.NET osztályok tartoznak. Ha például az SqlClient-szolgáltatóval szeretne csatlakozni egy adatbázishoz, használja az osztálytSqlConnection. Ha ki szeretne adni egy INSERT, UPDATE, DELETEvagy SELECT parancsot az adatbázisnak, használja az osztálytSqlCommand.

A tranzakciós oktatóanyagban szereplő burkolóadatbázis-módosítások kivételével nem kellett alacsony szintű ADO.NET kódot írni, mert az automatikusan létrehozott TableAdapters-kód tartalmazza az adatbázishoz való csatlakozáshoz, a parancsok kiadásához, az adatok lekéréséhez és a DataTablesba való feltöltéséhez szükséges funkciókat. Előfordulhat azonban, hogy ezeket az alacsony szintű beállításokat testre kell szabnunk. A következő néhány lépésben megvizsgáljuk, hogyan koppinthat a TableAdapters által belsőleg használt ADO.NET objektumokra.

1. lépés: Vizsgálat a Kapcsolat tulajdonsággal

Minden TableAdapter-osztály rendelkezik egy Connection olyan tulajdonságtal, amely meghatározza az adatbázis-kapcsolat adatait. Ezt a tulajdonság adattípusát és ConnectionString értékét a TableAdapter Configuration varázslóban megadott beállítások határozzák meg. Ne feledje, hogy amikor először ad hozzá TableAdaptert egy gépelt adatkészlethez, a varázsló megkér minket az adatbázis forrására (lásd az 1. ábrát). Az első lépésben található legördülő lista tartalmazza a konfigurációs fájlban megadott adatbázisokat, valamint a Kiszolgálókezelő adatkapcsolataiban található egyéb adatbázisokat. Ha a használni kívánt adatbázis nem szerepel a legördülő listában, az Új kapcsolat gombra kattintva és a szükséges kapcsolatadatok megadásával új adatbázis-kapcsolat adható meg.

A TableAdapter konfigurációs varázsló első lépése

1. ábra: A TableAdapter konfigurációs varázsló első lépése (ide kattintva megtekintheti a teljes méretű képet)

Szánjunk egy kis időt a TableAdapter tulajdonság kódjának vizsgálatára Connection . Az Adatelérési réteg létrehozása oktatóanyagban leírtak szerint az automatikusan létrehozott TableAdapter-kód megtekintéséhez lépjen az Osztálynézet ablakra, fúrjon le a megfelelő osztályba, majd kattintson duplán a tag nevére.

Lépjen az Osztálynézet ablakra a Nézet menüben, és válassza az Osztálynézet lehetőséget (vagy nyomja le a Ctrl+Shift+C billentyűkombinációt). Az Osztálynézet ablak felső felében részletezze le a NorthwindTableAdapters névteret, és válassza ki az osztályt ProductsTableAdapter . Ez az osztálynézet alsó felében jeleníti meg az ProductsTableAdapter s tagokat a 2. ábrán látható módon. Kattintson duplán a tulajdonságra a Connection kód megtekintéséhez.

Double-Click a kapcsolat tulajdonságot az osztálynézetben az automatikusan létrehozott kód megtekintéséhez

2. ábra: Double-Click a Kapcsolat tulajdonságot használja az Osztály nézetben az automatikusan generált kód megtekintéséhez

A TableAdapter Connection tulajdonsága és más kapcsolattal kapcsolatos kód következik:

Private _connection As System.Data.SqlClient.SqlConnection
Private Sub InitConnection()
    Me._connection = New System.Data.SqlClient.SqlConnection
    Me._connection.ConnectionString = _
        ConfigurationManager.ConnectionStrings("NORTHWNDConnectionString").ConnectionString
End Sub
Friend Property Connection() As System.Data.SqlClient.SqlConnection
    Get
        If (Me._connection Is Nothing) Then
            Me.InitConnection
        End If
        Return Me._connection
    End Get
    Set
        Me._connection = value
        If (Not (Me.Adapter.InsertCommand) Is Nothing) Then
            Me.Adapter.InsertCommand.Connection = value
        End If
        If (Not (Me.Adapter.DeleteCommand) Is Nothing) Then
            Me.Adapter.DeleteCommand.Connection = value
        End If
        If (Not (Me.Adapter.UpdateCommand) Is Nothing) Then
            Me.Adapter.UpdateCommand.Connection = value
        End If
        Dim i As Integer = 0
        Do While (i < Me.CommandCollection.Length)
            If (Not (Me.CommandCollection(i)) Is Nothing) Then
                CType(Me.CommandCollection(i), _
                    System.Data.SqlClient.SqlCommand).Connection = value
            End If
            i = (i + 1)
        Loop
    End Set
End Property

A TableAdapter osztály példányosításakor a tagváltozó _connection egyenlő Nothing. Connection A tulajdonság elérésekor először ellenőrzi, hogy a _connection tagváltozó példányosítva lett-e. Ha még nem tette meg, a rendszer meghívja a InitConnection metódust, amely példányosítja a _connection-t, és annak ConnectionString tulajdonságát a TableAdapter Configuration varázsló első lépésében megadott kapcsolati sztringértékre állítja.

A Connection tulajdonság egy SqlConnection objektumhoz is hozzárendelhető. Ezzel társítja az új SqlConnection objektumot az egyes TableAdapter-objektumokhoz SqlCommand .

2. lépés: A Connection-Level beállításainak felfedés

A kapcsolati információknak a TableAdapterbe ágyazva kell maradniuk, és nem lesznek elérhetők az alkalmazásarchitektúra más rétegei számára. Előfordulhat azonban, hogy a TableAdapter kapcsolatszintű információinak elérhetőnek vagy testreszabhatónak kell lenniük egy lekérdezéshez, felhasználóhoz vagy ASP.NET oldalhoz.

Bővítsük ki az ProductsTableAdapter Adathalmazban azt a Northwind tulajdonságot, amelyet az üzleti logikai réteg használhat a TableAdapter által használt kapcsolati sztring olvasásához vagy módosításához.

Megjegyzés:

A kapcsolati sztring olyan sztring, amely megadja az adatbázis kapcsolati adatait, például a használni kívánt szolgáltatót, az adatbázis helyét, a hitelesítési hitelesítő adatokat és az adatbázissal kapcsolatos egyéb beállításokat. A különböző adattárak és szolgáltatók által használt kapcsolati sztringminták listájáért lásd ConnectionStrings.com.

Az adatelérési réteg létrehozása oktatóanyagban leírtak szerint a Gépelt adathalmaz automatikusan létrehozott osztályai részleges osztályok használatával bővíthetők. Először hozzon létre egy új, ConnectionAndCommandSettings elnevezett almappát a ~/App_Code/DAL mappában a projekt keretein belül.

ConnectionAndCommandSettings nevű almappá hozzáadása

3. ábra: Almappa hozzáadása a következő névvel ConnectionAndCommandSettings

Adjon hozzá egy új osztályfájlt, ProductsTableAdapter.ConnectionAndCommandSettings.vb és írja be a következő kódot:

Namespace NorthwindTableAdapters
    Partial Public Class ProductsTableAdapter
        Public Property ConnectionString() As String
            Get
                Return Me.Connection.ConnectionString
            End Get
            Set(ByVal value As String)
                Me.Connection.ConnectionString = value
            End Set
        End Property
    End Class
End Namespace

Ez a részleges osztály hozzáad egy Public nevű tulajdonságot az ConnectionString osztályhoz, amely lehetővé teszi bármely réteg számára, hogy elolvassa vagy frissítse a TableAdapter mögöttes kapcsolatának kapcsolati karakterláncát.

Miután létrehozta (és elmentette) a részleges osztályt, nyissa meg a ProductsBLL osztályt. Lépjen az egyik meglévő metódusra, és írja be, Adapter majd nyomja le a pont billentyűt az IntelliSense megnyitásához. Az IntelliSense-ben elérhető új ConnectionString tulajdonságnak kell megjelennie, ami azt jelenti, hogy programozott módon olvashatja vagy módosíthatja ezt az értéket a BLL-ből.

A teljes kapcsolatobjektum felfedése

Ez a részleges osztály a mögöttes kapcsolatobjektumnak csak egy tulajdonságát teszi elérhetővé: ConnectionString. Ha a teljes kapcsolati objektumot elérhetővé szeretné tenni a TableAdapter korlátain túl, módosíthatja a Connection tulajdonság s védelmi szintjét. Az 1. lépésben megvizsgált automatikusan létrehozott kód azt mutatta, hogy a TableAdapter s Connection tulajdonsága úgy van megjelölve Friend, hogy csak ugyanabban a szerelvényben lévő osztályok férhetnek hozzá. Ez azonban a TableAdapter tulajdonságon ConnectionModifier keresztül módosítható.

Nyissa meg az Northwind Adathalmazt, kattintson a ProductsTableAdapter Tervezőben lévő elemre, és lépjen a Tulajdonságok ablakra. Itt az alapértelmezett értékre állítva jelenik ConnectionModifier meg. Assembly Ha elérhetővé szeretné tenni a Connection tulajdonságot a Typed DataSet szerelvényén kívül, változtassa a ConnectionModifier tulajdonságot Public tulajdonsággá.

A Kapcsolat tulajdonság akadálymentességi szintje a ConnectionModifier tulajdonságon keresztül konfigurálható

4. ábra: A Connection tulajdonság akadálymentességi szintje konfigurálható a tulajdonságon keresztül (ConnectionModifier teljes méretű kép megtekintéséhez)

Mentse az Adathalmazt, majd térjen vissza az ProductsBLL osztályhoz. A korábbiakhoz hasonlóan lépjen az egyik meglévő metódusra, és írja be Adapter , majd nyomja le a pontkulcsot az IntelliSense használatához. A listának tartalmaznia kell egy tulajdonságot Connection , ami azt jelenti, hogy mostantól programozott módon elolvashatja vagy hozzárendelheti a kapcsolatszintű beállításokat a BLL-ből.

A TableAdapter egy fő lekérdezésből áll, amely alapértelmezés szerint automatikusan generált INSERT, UPDATEés DELETE utasításokat tartalmaz. Ez a fő lekérdezés és INSERTUPDATEDELETE utasítás a TableAdapter s kódjában ADO.NET adatadapter objektumként van implementálva a Adapter tulajdonságon keresztül. A tulajdonsághoz Connection hasonlóan a Adapter tulajdonság adattípusát a használt adatszolgáltató határozza meg. Mivel ezek az oktatóanyagok az SqlClient-szolgáltatót használják, a Adapter tulajdonság típusa a(z) SqlDataAdapter.

A TableAdapter s Adapter tulajdonság három olyan típusú SqlCommand tulajdonsággal rendelkezik, amelyeket a INSERT. UPDATEés DELETE utasítások kiadásához használ:

  • InsertCommand
  • UpdateCommand
  • DeleteCommand

Az SqlCommand objektumok feladata, hogy egy adott lekérdezést küldjenek az adatbázisba, és olyan tulajdonságokkal rendelkeznek, mint: CommandText, amely tartalmazza az alkalmi SQL-utasítást vagy a végrehajtandó tárolt eljárást; és Parameters, amely objektumgyűjtemény SqlParameter . Ahogy az Adatelérési réteg létrehozása oktatóanyagban is láttuk, ezek a parancsobjektumok testre szabhatók a Tulajdonságok ablakban.

A TableAdapter a fő lekérdezés mellett változó számú metódust is tartalmazhat, amelyek meghívásakor egy megadott parancsot küldenek az adatbázisba. A fő lekérdezési parancsobjektum és az összes további metódus parancsobjektumai a TableAdapter s CommandCollection tulajdonságban vannak tárolva.

Szánjunk egy pillanatot arra, hogy megnézzük a ProductsTableAdapter Adatkészletben a Northwind által generált kódot ehhez a két tulajdonsághoz és azok támogató tagváltozókhoz, valamint segédmetódusokhoz.

Private WithEvents _adapter As System.Data.SqlClient.SqlDataAdapter
Private Sub InitAdapter()
    Me._adapter = New System.Data.SqlClient.SqlDataAdapter
    
    ... Code that creates the InsertCommand, UpdateCommand, ...
    ... and DeleteCommand instances - omitted for brevity ...
End Sub
Private ReadOnly Property Adapter() As System.Data.SqlClient.SqlDataAdapter
    Get
        If (Me._adapter Is Nothing) Then
            Me.InitAdapter
        End If
        Return Me._adapter
    End Get
End Property
Private _commandCollection() As System.Data.SqlClient.SqlCommand
Private Sub InitCommandCollection()
    Me._commandCollection = New System.Data.SqlClient.SqlCommand(8) {}
    ... Code that creates the command objects for the main query and the ...
    ... ProductsTableAdapter�s other eight methods - omitted for brevity ...
End Sub
Protected ReadOnly Property CommandCollection() As System.Data.SqlClient.SqlCommand()
    Get
        If (Me._commandCollection Is Nothing) Then
            Me.InitCommandCollection
        End If
        Return Me._commandCollection
    End Get
End Property

A tulajdonság kódja Adapter és CommandCollection tulajdonságai szorosan utánozzák a Connection tulajdonságot. Vannak tagváltozók, amelyek a tulajdonságok által használt objektumokat tartják. A tulajdonságok Get tartozékai először ellenőrzik, hogy a megfelelő tagváltozó van-e Nothing. Ha igen, inicializálási metódust nevezünk, amely létrehozza a tagváltozó egy példányát, és hozzárendeli az alapvető parancsokkal kapcsolatos tulajdonságokat.

4. lépés: A Command-Level beállításainak felfedés

Ideális esetben a parancsszintű információknak az adatelérési rétegbe kell beágyazva maradniuk. Ha ezekre az információkra az architektúra más rétegeiben is szükség van, akkor azonban részleges osztályon keresztül is közzétehetők, hasonlóan a kapcsolatszintű beállításokhoz.

Mivel a TableAdapter csak egyetlen Connection tulajdonságot tartalmaz, a kapcsolatszintű beállítások felfedéséhez szükséges kód meglehetősen egyszerű. A parancsszintű beállítások módosításakor a dolgok kissé bonyolultabbak, mert a TableAdapter több parancsobjektummal is rendelkezhet – egy InsertCommand, UpdateCommandés DeleteCommand– a tulajdonságban lévő CommandCollection parancsobjektumok változó számával együtt. A parancsszintű beállítások frissítésekor ezeket a beállításokat az összes parancsobjektumra propagálja.

Tegyük fel például, hogy voltak olyan lekérdezések a TableAdapterben, amelyek végrehajtása rendkívüli hosszú időt vett igénybe. Ha a TableAdapter használatával hajtja végre az egyik lekérdezést, érdemes lehet növelni a parancsobjektum tulajdonságátCommandTimeout. Ez a tulajdonság a parancs végrehajtására váró másodpercek számát adja meg, az alapértelmezett érték pedig 30.

Ha engedélyezni szeretné, hogy a CommandTimeout tulajdonságot a BLL módosítsa, adja hozzá a következő Public metódust a ProductsDataTable 2. lépésben létrehozott részleges osztályfájlhoz:ProductsTableAdapter.ConnectionAndCommandSettings.vb

Public Sub SetCommandTimeout(ByVal timeout As Integer)
    If Me.Adapter.InsertCommand IsNot Nothing Then
        Me.Adapter.InsertCommand.CommandTimeout = timeout
    End If
    If Me.Adapter.DeleteCommand IsNot Nothing Then
        Me.Adapter.DeleteCommand.CommandTimeout = timeout
    End If
    If Me.Adapter.UpdateCommand IsNot Nothing Then
        Me.Adapter.UpdateCommand.CommandTimeout = timeout
    End If
    For i As Integer = 0 To Me.CommandCollection.Length - 1
        If Me.CommandCollection(i) IsNot Nothing Then
            Me.CommandCollection(i).CommandTimeout = timeout
        End If
    Next
End Sub

Ez a metódus meghívható a BLL-ből vagy a bemutatórétegből, hogy az adott TableAdapter-példány minden parancsproblémájához beállítsa a parancsok időtúllépését.

Megjegyzés:

A Adapter és CommandCollection tulajdonságok úgy vannak jelölve, mint Private, ami azt jelenti, hogy csak a TableAdapteren belüli kódból érhetők el. A tulajdonságtól eltérően ezek a Connection hozzáférési módosítók nem konfigurálhatók. Ezért ha parancsszintű tulajdonságokat kell elérhetővé tennie az architektúra más rétegei számára, a fent tárgyalt részleges osztály megközelítést kell használnia, hogy olyan metódust Public vagy tulajdonságot biztosítson, amely beolvassa vagy beírja a Private parancsobjektumokat.

Összefoglalás

A Typed DataSet táblázatokhoz tartozó adapterei az adathozzáférés részleteinek és összetettségének beágyazására szolgálnak. A TableAdapters használatával nem kell amiatt aggódnunk, hogy ADO.NET kódot írunk az adatbázishoz való csatlakozáshoz, kiadunk egy parancsot, vagy feltöltjük az eredményeket egy DataTable-ba. Minden automatikusan történik számunkra.

Előfordulhat azonban, hogy testre kell szabnunk az alacsony szintű ADO.NET-beállításokat, például módosítani kell a kapcsolati sztringet, illetve az alapértelmezett kapcsolati vagy parancs-időtúllépési értékeket. A TableAdapter automatikusan létrehozott Connection, Adapter és CommandCollection tulajdonságokat tartalmaz, de ezek alapértelmezés szerint vagy Friend vagy Private. Ez a belső információ hozzáférhetővé válik, ha a TableAdapter-t részleges osztályokkal bővítjük, hogy tartalmazza a Public metódusokat vagy tulajdonságokat. Másik lehetőségként a TableAdapter tulajdonsághozzáférési Connection módosító a TableAdapter s ConnectionModifier tulajdonságon keresztül konfigurálható.

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 fő véleményezői Burnadette Leigh, S ren Jacob Lauritsen, Teresa Murphy és Hilton Geisenow voltak. Szeretné áttekinteni a közelgő MSDN-cikkeimet? Ha igen, írj egy sort a mitchell@4GuysFromRolla.com-ra.