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
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:
- Hozzon létre kapcsolatot az adatbázissal.
- Adjon ki egy parancsot.
- 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
, DELETE
vagy 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.
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.
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.
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á.
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.
3. lépés: A Command-Related tulajdonságainak vizsgálata
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 INSERT
UPDATE
DELETE
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.