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 System.Data.SqlClient.SqlConnection _connection;
private void InitConnection() {
this._connection = new System.Data.SqlClient.SqlConnection();
this._connection.ConnectionString =
ConfigurationManager.ConnectionStrings["NORTHWNDConnectionString"].ConnectionString;
}
internal System.Data.SqlClient.SqlConnection Connection {
get {
if ((this._connection == null)) {
this.InitConnection();
}
return this._connection;
}
set {
this._connection = value;
if ((this.Adapter.InsertCommand != null)) {
this.Adapter.InsertCommand.Connection = value;
}
if ((this.Adapter.DeleteCommand != null)) {
this.Adapter.DeleteCommand.Connection = value;
}
if ((this.Adapter.UpdateCommand != null)) {
this.Adapter.UpdateCommand.Connection = value;
}
for (int i = 0; (i < this.CommandCollection.Length); i = (i + 1)) {
if ((this.CommandCollection[i] != null)) {
((System.Data.SqlClient.SqlCommand)
(this.CommandCollection[i])).Connection = value;
}
}
}
}
A TableAdapter osztály példányosításakor a tagváltozó _connection
egyenlő null
.
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.cs
és írja be a következő kódot:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
namespace NorthwindTableAdapters
{
public partial class ProductsTableAdapter
{
public string ConnectionString
{
get
{
return this.Connection.ConnectionString;
}
set
{
this.Connection.ConnectionString = value;
}
}
}
}
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 internal
, 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 System.Data.SqlClient.SqlDataAdapter _adapter;
private void InitAdapter() {
this._adapter = new System.Data.SqlClient.SqlDataAdapter();
... Code that creates the InsertCommand, UpdateCommand, ...
... and DeleteCommand instances - omitted for brevity ...
}
private System.Data.SqlClient.SqlDataAdapter Adapter {
get {
if ((this._adapter == null)) {
this.InitAdapter();
}
return this._adapter;
}
}
private System.Data.SqlClient.SqlCommand[] _commandCollection;
private void InitCommandCollection() {
this._commandCollection = new System.Data.SqlClient.SqlCommand[9];
... Code that creates the command objects for the main query and the ...
... ProductsTableAdapter�s other eight methods - omitted for brevity ...
}
protected System.Data.SqlClient.SqlCommand[] CommandCollection {
get {
if ((this._commandCollection == null)) {
this.InitCommandCollection();
}
return this._commandCollection;
}
}
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 null
. 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.cs
public void SetCommandTimeout(int timeout)
{
if (this.Adapter.InsertCommand != null)
this.Adapter.InsertCommand.CommandTimeout = timeout;
if (this.Adapter.DeleteCommand != null)
this.Adapter.DeleteCommand.CommandTimeout = timeout;
if (this.Adapter.UpdateCommand != null)
this.Adapter.UpdateCommand.CommandTimeout = timeout;
for (int i = 0; i < this.CommandCollection.Length; i++)
if (this.CommandCollection[i] != null)
this.CommandCollection[i].CommandTimeout = timeout;
}
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 internal
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.