Sdílet prostřednictvím


Konfigurace připojení vrstvy přístupu k datům a nastavení na úrovni příkazu (VB)

Scott Mitchell

Stáhnout PDF

Objekty TableAdapter v zadané datové sadě se automaticky starají o připojení k databázi, vydávání příkazů a naplnění datatable výsledky. Existují ale situace, kdy se chceme o tyto podrobnosti postarat sami, a v tomto kurzu se dozvíme, jak získat přístup k nastavení připojení k databázi a k nastavení na úrovni příkazů v objektu TableAdapter.

Úvod

V celé sérii kurzů jsme použili typed datasets k implementaci vrstvené architektury pro přístup k datům a obchodních objektů. Jak je popsáno v prvním kurzu, typed DataSet s DataTables slouží jako úložiště dat, zatímco Objekty TableAdapter fungují jako obálky pro komunikaci s databází za účelem načtení a úpravy podkladových dat. Funkce TableAdapter zapouzdřují složitost práce s databází a šetří nás před tím, abychom museli psát kód pro připojení k databázi, vydávat příkaz nebo naplnit výsledky do tabulky DataTable.

Někdy se však musíme ponořit do hloubky objektu TableAdapter a napsat kód, který funguje přímo s objekty ADO.NET. V kurzu Zabalení úprav databáze v rámci transakce jsme například do objektu TableAdapter přidali metody pro zahájení, potvrzení a vrácení zpět ADO.NET transakcí. Tyto metody používaly interní ručně vytvořený SqlTransaction objekt, který byl přiřazen k objektům TableAdapter s SqlCommand .

V tomto kurzu se podíváme, jak získat přístup k nastavení připojení k databázi a nastavení na úrovni příkazů v objektu TableAdapter. Konkrétně do objektu ProductsTableAdapter přidáme funkce, které umožní přístup k základnímu nastavení připojovací řetězec a vypršení časového limitu příkazů.

Práce s daty pomocí ADO.NET

Rozhraní Microsoft .NET Framework obsahuje celou řadu tříd navržených speciálně pro práci s daty. Tyto třídy, které se nacházejí v oboruSystem.Data názvů, se označují jako třídy ADO.NET. Některé třídy pod zastřešující ADO.NET jsou vázané na konkrétního poskytovatele dat. Poskytovatele dat si můžete představit jako komunikační kanál, který umožňuje tok informací mezi ADO.NET třídami a podkladovým úložištěm dat. Existují zobecněné zprostředkovatelé, jako jsou OleDb a ODBC, a také poskytovatelé, kteří jsou speciálně navrženi pro konkrétní databázový systém. Přestože je například možné se připojit k databázi Microsoft SQL Server pomocí zprostředkovatele OleDb, poskytovatel SqlClient je mnohem efektivnější, protože byl navržen a optimalizován speciálně pro SQL Server.

Při programovém přístupu k datům se běžně používá následující model:

  1. Navázat připojení k databázi.
  2. Vydejte příkaz.
  3. U SELECT dotazů pracujte s výslednými záznamy.

Pro provedení každého z těchto kroků existují samostatné třídy ADO.NET. Pokud se chcete připojit k databázi pomocí zprostředkovatele SqlClient, použijte SqlConnection například třídu . Pokud chcete do databáze vydat INSERTpříkaz , UPDATEDELETE, neboSELECT, použijte SqlCommand třídu .

S výjimkou kurzu Obtékání úprav databáze v rámci kurzu Transakce jsme nemuseli sami zapisovat žádný kód ADO.NET nízké úrovně, protože automaticky vygenerovaný kód TableAdapter obsahuje funkce potřebné pro připojení k databázi, vydávání příkazů, načítání dat a naplnění dat do DataTables. Může se ale stát, že tato nastavení nízké úrovně budeme muset přizpůsobit. V dalších několika krocích prozkoumáme, jak se připojit k objektům ADO.NET, které interně používají Objekty TableAdapter.

Krok 1: Zkoumání vlastnosti připojení

Každá třída TableAdapter má Connection vlastnost, která určuje informace o připojení k databázi. Datový typ a ConnectionString hodnota této vlastnosti jsou určeny výběrem provedenými v průvodci konfigurací objektu TableAdapter. Připomeňme si, že když poprvé přidáme TableAdapter do zadané datové sady, tento průvodce nás požádá o zdroj databáze (viz obrázek 1). Rozevírací seznam v tomto prvním kroku obsahuje databáze zadané v konfiguračním souboru a také všechny ostatní databáze v datovém Connections Průzkumníka serveru. Pokud databáze, kterou chceme použít, v rozevíracím seznamu neexistuje, je možné zadat nové připojení k databázi kliknutím na tlačítko Nové připojení a poskytnutím potřebných informací o připojení.

První krok Průvodce konfigurací nástroje TableAdapter

Obrázek 1: První krok Průvodce konfigurací nástroje TableAdapter (kliknutím zobrazíte obrázek v plné velikosti)

Pojďme chvíli zkontrolovat kód pro vlastnost TableAdapter s Connection . Jak je uvedeno v kurzu Vytvoření vrstvy přístupu k datům , automaticky vygenerovaný kód objektu TableAdapter můžeme zobrazit tak, že přejdeme do okna Zobrazení třídy, přejdeme k příslušné třídě a poklikáním na název člena.

Přejděte do okna Zobrazení třídy tak, že přejdete do nabídky Zobrazení a zvolíte Zobrazení třídy (nebo zadáte Ctrl+Shift+C). V horní polovině okna Zobrazení třídy přejděte k NorthwindTableAdapters oboru názvů a vyberte ProductsTableAdapter třídu. ProductsTableAdapter Zobrazí se členy s v dolní polovině zobrazení třídy, jak je znázorněno na obrázku 2. Poklikáním na Connection vlastnost zobrazíte její kód.

Poklikáním na vlastnost připojení v zobrazení třídy zobrazte její automaticky vygenerovaný kód.

Obrázek 2: Double-Click vlastnost connection v zobrazení třídy k zobrazení automaticky generovaného kódu

Vlastnost TableAdapter s Connection a další kód související s připojením jsou následující:

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

Při vytvoření instance třídy TableAdapter je člen proměnná _connection rovna Nothing. Při přístupu k Connection vlastnosti se nejprve zkontroluje, jestli _connection došlo k vytvoření instance členské proměnné. Pokud není, InitConnection vyvolá se metoda, která vytvoří instanci _connection a nastaví její ConnectionString vlastnost na hodnotu připojovací řetězec zadanou v prvním kroku Průvodce konfigurací TableAdapter.

Vlastnost Connection lze také přiřadit k objektu SqlConnection . Tím přidružíte nový SqlConnection objekt ke každému objektu TableAdapter s SqlCommand .

Krok 2: Zveřejnění nastavení Connection-Level

Informace o připojení by měly zůstat zapouzdřené v objektu TableAdapter a neměly by být přístupné jiným vrstvám v architektuře aplikace. Mohou však narazit situace, kdy informace na úrovni připojení tableadapter musí být přístupné nebo přizpůsobitelné pro dotaz, uživatele nebo ASP.NET stránku.

ProductsTableAdapter Rozšiřme objekt v Northwind datové sadě tak, aby zahrnoval ConnectionString vlastnost, která může být použita vrstvou obchodní logiky ke čtení nebo změně připojovací řetězec používané objektem TableAdapter.

Poznámka

připojovací řetězec je řetězec, který určuje informace o připojení k databázi, jako je poskytovatel, který se má použít, umístění databáze, přihlašovací údaje pro ověřování a další nastavení související s databází. Seznam připojovací řetězec vzorů používaných různými úložišti dat a poskytovateli najdete v tématu ConnectionStrings.com.

Jak je popsáno v kurzu Vytvoření vrstvy přístupu k datům , automaticky generované třídy Typed DataSet s lze rozšířit pomocí částečných tříd. Nejprve vytvořte novou podsložku v projektu s názvem ConnectionAndCommandSettings pod složkou ~/App_Code/DAL .

Přidání podsložky ConnectionAndCommandSettings

Obrázek 3: Přidání podsložky s názvem ConnectionAndCommandSettings

Přidejte nový soubor třídy s názvem ProductsTableAdapter.ConnectionAndCommandSettings.vb a zadejte následující kód:

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

Tato částečná Public třída přidá vlastnost s názvem ConnectionString třídyProductsTableAdapter, která umožňuje jakékoli vrstvě číst nebo aktualizovat připojovací řetězec pro základní připojení TableAdapter.

Po vytvoření (a uložení) této částečné třídy otevřete ProductsBLL třídu. Přejděte na některou z existujících metod a zadejte Adapter a stisknutím klávesy tečky vyvolejte IntelliSense. Měla by se zobrazit nová ConnectionString vlastnost dostupná v IntelliSense, což znamená, že tuto hodnotu můžete programově číst nebo upravovat z BLL.

Zveřejnění celého objektu připojení

Tato částečná třída zveřejňuje pouze jednu vlastnost objektu základního připojení: ConnectionString. Pokud chcete zpřístupnit celý objekt připojení nad rámec omezení objektu TableAdapter, můžete také změnit Connection úroveň ochrany vlastností. Automaticky vygenerovaný kód, který jsme prozkoumali v kroku 1, ukázalo, že vlastnost TableAdapter s Connection je označena jako Friend, což znamená, že k ní mohou přistupovat pouze třídy ve stejném sestavení. To je však možné změnit prostřednictvím vlastnosti TableAdapter s ConnectionModifier .

Otevřete datová Northwind sada, klikněte na ProductsTableAdapter Designer a přejděte na okno Vlastnosti. Tam uvidíte hodnotu nastavenou ConnectionModifier na výchozí hodnotu Assembly. Pokud chcete vlastnost zpřístupnit Connection mimo sestavení Typed DataSet s, změňte ConnectionModifier vlastnost na Public.

Úroveň přístupnosti vlastnosti připojení je možné nakonfigurovat prostřednictvím vlastnosti ConnectionModifier.

Obrázek 4: Úroveň Connection přístupnosti vlastnosti lze nakonfigurovat prostřednictvím ConnectionModifier vlastnosti (kliknutím zobrazíte obrázek v plné velikosti)

Uložte DataSet a pak se vraťte do ProductsBLL třídy. Stejně jako předtím přejděte na některou z existujících metod a zadejte Adapter a stisknutím klávesy tečky vyvolejte IntelliSense. Seznam by měl obsahovat Connection vlastnost, což znamená, že teď můžete programově číst nebo přiřadit nastavení na úrovni připojení z BLL.

Objekt TableAdapter se skládá z hlavního dotazu, který má ve výchozím nastavení automaticky vygenerované INSERTpříkazy , UPDATEa DELETE . Tento hlavní dotaz s INSERT, UPDATEa DELETE příkazy jsou implementovány v kódu TableAdapter jako ADO.NET objekt datového adaptéru Adapter prostřednictvím vlastnosti. Podobně jako u vlastnosti ConnectionAdapter je datový typ vlastnosti určen použitým poskytovatelem dat. Vzhledem k tomu, že tyto kurzy používají zprostředkovatele SqlClient, Adapter je vlastnost typu SqlDataAdapter.

Vlastnost TableAdapter s Adapter má tři vlastnosti typu SqlCommand , které používá k vydání INSERTpříkazů , UPDATEa DELETE :

  • InsertCommand
  • UpdateCommand
  • DeleteCommand

Objekt SqlCommand zodpovídá za odeslání konkrétního dotazu do databáze a má vlastnosti jako: CommandText, který obsahuje ad hoc příkaz SQL nebo uloženou proceduru, která se má spustit; a Parameters, což je kolekce SqlParameter objektů. Jak jsme viděli v kurzu Vytvoření vrstvy přístupu k datům, tyto objekty příkazů je možné přizpůsobit prostřednictvím okno Vlastnosti.

Kromě hlavního dotazu může objekt TableAdapter obsahovat proměnný počet metod, které při vyvolání odešlou zadaný příkaz do databáze. Objekt příkazu hlavního dotazu s a objekty příkazů pro všechny další metody jsou uloženy ve vlastnosti TableAdapter s CommandCollection .

Pojďme se na chvíli podívat na kód vygenerovaný objektem ProductsTableAdapter v Northwind datové sadě pro tyto dvě vlastnosti a jejich podpůrné členské proměnné a pomocné metody:

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

Kód vlastností Adapter a CommandCollection úzce napodobuje Connection kód vlastnosti. Existují členské proměnné, které obsahují objekty používané vlastnostmi. Přístupové objekty vlastností Get začínají kontrolou, jestli je Nothingodpovídající proměnná člena . Pokud ano, je volána metoda inicializace, která vytvoří instanci členské proměnné a přiřadí základní vlastnosti související s příkazy.

Krok 4: Zveřejnění nastavení Command-Level

V ideálním případě by informace na úrovni příkazu měly zůstat zapouzdřené v rámci vrstvy přístupu k datům. Pokud by však tyto informace byly potřeba v jiných vrstvách architektury, mohou být zpřístupněny prostřednictvím částečné třídy, stejně jako u nastavení na úrovni připojení.

Vzhledem k tomu, TableAdapter má pouze jednu Connection vlastnost, kód pro zveřejnění nastavení na úrovni připojení je poměrně jednoduchý. Při úpravě nastavení na úrovni příkazů je to trochu složitější, protože Objekt TableAdapter může mít více objektů příkazů – InsertCommand, UpdateCommanda DeleteCommanda společně s proměnným počtem objektů příkazů ve CommandCollection vlastnosti . Při aktualizaci nastavení na úrovni příkazů bude potřeba tato nastavení rozšířit na všechny objekty příkazů.

Představte si například, že v objektu TableAdapter byly určité dotazy, které trvaly mimořádně dlouhou dobu. Při použití objektu TableAdapter ke spuštění některého z těchto dotazů můžeme chtít zvýšit vlastnost objektu CommandTimeouts příkazu. Tato vlastnost určuje počet sekund čekání na provedení příkazu a výchozí hodnota je 30.

Pokud chcete povolit úpravu CommandTimeout vlastnosti pomocí BLL, přidejte Public následující metodu ProductsDataTable do souboru částečné třídy vytvořeného v kroku 2 (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

Tuto metodu lze vyvolat z vrstvy BLL nebo Presentation k nastavení časového limitu příkazu pro všechny příkazy problémy, které tableAdapter instance.

Poznámka

Adapter Vlastnosti a CommandCollection jsou označené jako Private, což znamená, že k nim lze přistupovat pouze z kódu v objektu TableAdapter. Connection Na rozdíl od vlastnosti nejsou tyto modifikátory přístupu konfigurovatelné. Proto pokud potřebujete zpřístupnit vlastnosti na úrovni příkazu jiným vrstvám v architektuře, musíte použít metodu částečné třídy popsané výše k poskytnutí Public metody nebo vlastnosti, která čte nebo zapisuje do Private objektů příkazů.

Souhrn

Objekty TableAdapter v typed DataSet slouží k zapouzdření podrobností a složitosti přístupu k datům. Při použití objektů TableAdapter se nemusíme starat o zápis ADO.NET kódu pro připojení k databázi, vydání příkazu nebo naplnění výsledků do tabulky DataTable. Vše se zpracovává automaticky za nás.

Může se ale stát, že budeme potřebovat přizpůsobit specifika ADO.NET nízké úrovně, například změnit připojovací řetězec nebo výchozí hodnoty časového limitu připojení nebo příkazu. Objekt TableAdapter má automaticky generované Connectionvlastnosti , Adaptera CommandCollection , ale ve výchozím nastavení jsou to buď Friend , nebo Private. Tyto interní informace lze zpřístupnit rozšířením objektu TableAdapter pomocí částečných tříd tak, aby zahrnovaly Public metody nebo vlastnosti. Alternativně lze modifikátor přístupu vlastnosti TableAdapter nakonfigurovat Connection prostřednictvím vlastnosti TableAdapter s ConnectionModifier .

Všechno nejlepší na programování!

O autorovi

Scott Mitchell, autor sedmi knih o ASP/ASP.NET a zakladatel 4GuysFromRolla.com, pracuje s webovými technologiemi Microsoftu od roku 1998. Scott pracuje jako nezávislý konzultant, školitel a spisovatel. Jeho nejnovější kniha je Sams Teach Yourself ASP.NET 2.0 in 24 Hours. Můžete ho zastihnout na mitchell@4GuysFromRolla.comadrese . nebo prostřednictvím jeho blogu, který najdete na adrese http://ScottOnWriting.NET.

Zvláštní poděkování

Tato série kurzů byla zkontrolována mnoha užitečnými recenzenty. Hlavními recenzenty pro tento kurz byli Burnadette Leigh, S ren Jacob Lauritsen, Teresa Murphy a Hilton Geisenow. Chtěli byste si projít své nadcházející články na webu MSDN? Pokud ano, dejte mi řádek na mitchell@4GuysFromRolla.com.