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


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

á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:

  • 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, 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 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.

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

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