Veri Erişim Katmanının Bağlantısını ve Komut Düzeyi Ayarlarını Yapılandırma (VB)

tarafından Scott Mitchell

PDF’yi İndir

Typed DataSet içindeki TableAdapters otomatik olarak veritabanına bağlanma, komut verme ve sonuçlarla bir DataTable doldurma işlemlerini halleder. Ancak bu ayrıntıları kendimiz ele almak istediğimiz durumlar vardır ve bu öğreticide TableAdapter'da veritabanı bağlantısına ve komut düzeyi ayarlarına nasıl erişeceğinizi öğreniriz.

Giriş

Öğretici serisi boyunca, Katmanlı Mimarimizin Veri Erişim Katmanını ve iş nesnelerini uygulamak için Yazılan Veri Kümeleri'ni kullandık. İlk öğreticide açıklandığı gibi, Typed DataSet s DataTable'ları veri depoları olarak görev alırken TableAdapters, temel alınan verileri almak ve değiştirmek için veritabanıyla iletişim kurmak için sarmalayıcı görevi görür. TableAdapters, veritabanıyla çalışmayla ilgili karmaşıklığı kapsüller ve veritabanına bağlanmak, komut vermek veya sonuçları bir DataTable'a doldurmak için kod yazma zorunluluğundan kurtarır.

Ancak, TableAdapter'ın derinliklerine girmemiz ve doğrudan ADO.NET nesnelerle çalışan kod yazmamız gereken zamanlar vardır. Örneğin , bir İşlem içindeki Veritabanı Değişikliklerini Sarmalama öğreticisinde TableAdapter'a işlemleri başlatma, işleme ve ADO.NET geri döndürme yöntemleri ekledik. Bu yöntemler TableAdapter SqlCommand nesnelerine atanmış, el ile oluşturulmuş SqlTransaction bir iç nesne kullandı.

Bu öğreticide TableAdapter'da veritabanı bağlantısına ve komut düzeyi ayarlarına nasıl erişileceğini inceleyeceğiz. Özellikle, temel bağlantı dizesi ve komut zaman aşımı ayarlarına erişim sağlayan işlevler ProductsTableAdapter ekleyeceğiz.

ADO.NET Kullanarak Verilerle Çalışma

Microsoft .NET Framework, verilerle çalışmak için özel olarak tasarlanmış çok sayıda sınıf içerir. Ad alanındaSystem.Data bulunan bu sınıflar, ADO.NET sınıfları olarak adlandırılır. ADO.NET şemsiyesi altındaki sınıflardan bazıları belirli bir veri sağlayıcısına bağlıdır. Veri sağlayıcısını, bilgilerin ADO.NET sınıfları ile temel alınan veri deposu arasında akmasına olanak tanıyan bir iletişim kanalı olarak düşünebilirsiniz. OleDb ve ODBC gibi genelleştirilmiş sağlayıcıların yanı sıra belirli bir veritabanı sistemi için özel olarak tasarlanmış sağlayıcılar vardır. Örneğin, OleDb sağlayıcısını kullanarak bir Microsoft SQL Server veritabanına bağlanmak mümkün olsa da, SqlClient sağlayıcısı özellikle SQL Server için tasarlandığından ve iyileştirildiğinden çok daha verimlidir.

Verilere program aracılığıyla erişirken yaygın olarak aşağıdaki desen kullanılır:

  1. Veritabanıyla bağlantı kurun.
  2. Bir komut gönderin.
  3. Sorgular için SELECT sonuçta elde edilen kayıtlarla çalışın.

Bu adımların her birini gerçekleştirmek için ayrı ADO.NET sınıfları vardır. SqlClient sağlayıcısını kullanarak veritabanına bağlanmak için örneğin sınıfınıSqlConnection kullanın. Veritabanına bir INSERT, UPDATE, DELETEveya SELECT komutu vermek için sınıfınıSqlCommand kullanın.

TableAdapters otomatik olarak oluşturulan kod veritabanına bağlanmak, komut vermek, veri almak ve bu verileri DataTable'lara doldurmak için gereken işlevleri içerdiğinden, İşlem öğreticisi içindeki Sarmalama Veritabanı Değişiklikleri dışında, alt düzey ADO.NET kodu yazmamız gerekmez. Ancak, bu alt düzey ayarları özelleştirmemiz gereken zamanlar olabilir. Sonraki birkaç adımda TableAdapters tarafından dahili olarak kullanılan ADO.NET nesnelerine nasıl dokunacağımızı inceleyeceğiz.

1. Adım: Bağlantı Özelliği ile inceleme

Her TableAdapter sınıfının veritabanı bağlantı bilgilerini belirten bir Connection özelliği vardır. Bu özelliğin veri türü ve ConnectionString değeri TableAdapter Yapılandırma sihirbazında yapılan seçimler tarafından belirlenir. Typed DataSet'e ilk kez TableAdapter eklediğimizde bu sihirbazın veritabanı kaynağını istediğimizi unutmayın (bkz. Şekil 1). Bu ilk adımdaki açılan liste, yapılandırma dosyasında belirtilen veritabanlarının yanı sıra Sunucu Gezgini'nin Veri Connections diğer veritabanlarını içerir. Kullanmak istediğimiz veritabanı açılan listede yoksa, Yeni Bağlantı düğmesine tıklayıp gerekli bağlantı bilgileri sağlanarak yeni bir veritabanı bağlantısı belirtilebilir.

TableAdapter Yapılandırma Sihirbazı'nın İlk Adımı

Şekil 1: TableAdapter Yapılandırma Sihirbazı'nın İlk Adımı (Tam boyutlu görüntüyü görüntülemek için tıklayın)

TableAdapter s Connection özelliğinin kodunu incelemek için biraz zaman ayıralım. Veri Erişim Katmanı Oluşturma öğreticisinde belirtildiği gibi, Sınıf Görünümü penceresine gidip uygun sınıfa gidip üye adına çift tıklayarak otomatik olarak oluşturulan TableAdapter kodunu görüntüleyebiliriz.

Görünüm menüsüne gidip Sınıf Görünümü'nü seçerek (veya Ctrl+Shift+C yazarak) Sınıf Görünümü penceresine gidin. Sınıf Görünümü penceresinin üst yarısından ad alanına gidin NorthwindTableAdapters ve sınıfı seçin ProductsTableAdapter . Bu, Şekil 2'de gösterildiği gibi Sınıf Görünümünün alt yarısında s üyelerini görüntüler ProductsTableAdapter . Kodunu görmek için özelliğe çift tıklayın Connection .

Otomatik Olarak Oluşturulan Kodunu Görüntülemek için Sınıf Görünümünde Bağlantı Özelliğine Çift Tıklayın

Şekil 2: Otomatik Olarak Oluşturulan Kodunu Görüntülemek için Sınıf Görünümünde Bağlantı Özelliğini Double-Click

TableAdapter'ın Connection özelliği ve bağlantıyla ilgili diğer kod aşağıdaki gibidir:

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

TableAdapter sınıfı örneği oluşturulurken üye değişkeni _connection eşittir Nothing. Özelliğine Connection erişildiğinde, önce üye değişkeninin örneğinin _connection başlatılıp başlatılmadığını denetler. Aksi takdirde yöntemi InitConnection çağrılır ve bu yöntem, özelliğinin örneğini _connectionConnectionString oluşturur ve TableAdapter Yapılandırma sihirbazının ilk adımından belirtilen bağlantı dizesi değerine ayarlar.

Connection Özelliği bir SqlConnection nesneye de atanabilir. Bunun yapılması, yeni SqlConnection nesneyi TableAdapter nesnelerinin SqlCommand her biriyle ilişkilendirir.

2. Adım: Connection-Level Ayarlarını Açığa Çıkarma

Bağlantı bilgileri TableAdapter içinde kapsüllenmiş olarak kalmalı ve uygulama mimarisindeki diğer katmanlar için erişilebilir olmamalıdır. Ancak TableAdapter'ın bağlantı düzeyi bilgilerinin bir sorgu, kullanıcı veya ASP.NET sayfası için erişilebilir veya özelleştirilebilir olması gereken senaryolar olabilir.

DataSet'ini ProductsTableAdapterNorthwind, TableAdapter tarafından kullanılan bağlantı dizesi okumak veya değiştirmek için İş Mantığı Katmanı tarafından kullanılabilecek bir ConnectionString özellik içerecek şekilde genişletelim.

Not

bağlantı dizesi, kullanılacak sağlayıcı, veritabanının konumu, kimlik doğrulaması kimlik bilgileri ve veritabanıyla ilgili diğer ayarlar gibi veritabanı bağlantı bilgilerini belirten bir dizedir. Çeşitli veri depoları ve sağlayıcılar tarafından kullanılan bağlantı dizesi desenlerinin listesi için bkz. ConnectionStrings.com.

Veri Erişim Katmanı Oluşturma öğreticisinde açıklandığı gibi, Yazılan DataSet'in otomatik olarak oluşturulan sınıfları kısmi sınıfların kullanımıyla genişletilebilir. İlk olarak, projede klasörün altında ~/App_Code/DAL adlı ConnectionAndCommandSettings yeni bir alt klasör oluşturun.

ConnectionAndCommandSettings Adlı Bir Alt Klasör Ekleme

Şekil 3: Adlı Bir Alt Klasör Ekleme ConnectionAndCommandSettings

adlı ProductsTableAdapter.ConnectionAndCommandSettings.vb yeni bir sınıf dosyası ekleyin ve aşağıdaki kodu girin:

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

Bu kısmi sınıf, herhangi bir katmanın ProductsTableAdapter TableAdapter'ın temel bağlantısı için bağlantı dizesi okumasına veya güncelleştirmesine izin veren sınıfına adlı ConnectionString bir Public özellik ekler.

Bu kısmi sınıf oluşturulduktan (ve kaydedildikten) sonra sınıfını ProductsBLL açın. Mevcut yöntemlerden birine gidin ve yazın ve ardından IntelliSense'i Adapter ortaya çıkarmak için nokta tuşuna basın. IntelliSense'te yeni ConnectionString özelliğin kullanılabilir olduğunu görmeniz gerekir. Bu, BLL'den program aracılığıyla bu değeri okuyabileceğiniz veya ayarlayabildiğiniz anlamına gelir.

Tüm Bağlantı Nesnesini Açığa Çıkarma

Bu kısmi sınıf, temel alınan bağlantı nesnesinin yalnızca bir özelliğini kullanıma sunar: ConnectionString. Tüm bağlantı nesnesini TableAdapter sınırları dışında kullanılabilir hale getirmek istiyorsanız, alternatif olarak özelliğin Connection koruma düzeyini değiştirebilirsiniz. 1. Adımda incelediğimiz otomatik olarak oluşturulan kod, TableAdapter s Connection özelliğinin olarak Friendişaretlendiğini, yani yalnızca aynı derlemedeki sınıflar tarafından erişilebildiğini gösterdi. Ancak bu, TableAdapter'ın ConnectionModifier özelliği aracılığıyla değiştirilebilir.

DataSet'i Northwind açın, Tasarım Aracı öğesine tıklayın ProductsTableAdapter ve Özellikler penceresi gidin. Burada, varsayılan değerine Assemblyayarlanmış olan ConnectionModifier öğesini görürsünüz. Özelliği Typed DataSet derlemesinin dışında kullanılabilir hale getirmek Connection için özelliğini olarak PublicdeğiştirinConnectionModifier.

Connection Özelliğinin Erişilebilirlik Düzeyi ConnectionModifier Özelliği Aracılığıyla Yapılandırılabilir

Şekil 4: Özelliğin Connection Erişilebilirlik Düzeyi Özellik Aracılığıyla ConnectionModifier Yapılandırılabilir (Tam boyutlu görüntüyü görüntülemek için tıklayın)

DataSet'i kaydedin ve ardından sınıfına ProductsBLL dönün. Daha önce olduğu gibi mevcut yöntemlerden birine gidin ve yazın Adapter ve ardından IntelliSense'i ortaya çıkarmak için nokta tuşuna basın. Listede bir özellik bulunmalıdır; başka bir deyişle artık BLL'den herhangi bir Connection bağlantı düzeyi ayarlarını program aracılığıyla okuyabilir veya atayabilirsiniz.

TableAdapter, varsayılan olarak otomatik olarak oluşturulan INSERT, UPDATEve DELETE deyimlerini içeren bir ana sorgudan oluşur. Bu ana sorgunun INSERT, UPDATEve DELETE deyimleri TableAdapter kodunda özelliği aracılığıyla Adapter bir ADO.NET veri bağdaştırıcısı nesnesi olarak uygulanır. Özelliğinde Connection olduğu gibi özelliğin Adapter veri türü de kullanılan veri sağlayıcısı tarafından belirlenir. Bu öğreticiler SqlClient sağlayıcısını kullandığından Adapter , özelliği türündedir SqlDataAdapter.

TableAdapter özelliğiAdapter, , UPDATEve DELETE deyimlerini vermek INSERTiçin kullandığı türünde SqlCommand üç özelliğe sahiptir:

  • InsertCommand
  • UpdateCommand
  • DeleteCommand

Bir SqlCommand nesne veritabanına belirli bir sorgu göndermekle sorumludur ve şu özelliklere sahiptir: CommandText, yürütülecek geçici SQL deyimini veya saklı yordamı içerir; ve Parametersbir nesne koleksiyonudur SqlParameter . Veri Erişim Katmanı Oluşturma öğreticisinde gördüğümüz gibi, bu komut nesneleri Özellikler penceresi aracılığıyla özelleştirilebilir.

TableAdapter, ana sorgusuna ek olarak, çağrıldığında veritabanına belirtilen komutu gönderen çeşitli yöntemler içerebilir. Tüm ek yöntemler için ana sorgunun komut nesnesi ve komut nesneleri TableAdapter s CommandCollection özelliğinde depolanır.

Bu iki özellik için DataSet'te Northwind tarafından ProductsTableAdapter oluşturulan koda ve bunların destekleyici üye değişkenlerine ve yardımcı yöntemlerine göz atalım:

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

ve CommandCollection özelliklerinin koduAdapter, özelliğin Connection kodunu yakından taklit eder. Özellikleri tarafından kullanılan nesneleri tutan üye değişkenleri vardır. Özellikler Get erişimcileri, ilgili üye değişkeninin olup Nothingolmadığını denetleyerek başlar. Bu durumda, üye değişkeninin bir örneğini oluşturan ve komutla ilgili temel özellikleri atayan bir başlatma yöntemi çağrılır.

4. Adım: Command-Level Ayarlarını Açığa Çıkarma

İdeal olan, komut düzeyi bilgilerinin Veri Erişim Katmanı içinde kapsüllenmiş olarak kalmasıdır. Ancak mimarinin diğer katmanlarında bu bilgilere ihtiyaç duyulması halinde, bağlantı düzeyi ayarlarında olduğu gibi kısmi bir sınıf üzerinden kullanıma sunulur.

TableAdapter yalnızca tek Connection bir özelliğe sahip olduğundan, bağlantı düzeyi ayarlarını kullanıma açma kodu oldukça basittir. TableAdapter'da birden çok komut nesnesi olabileceğinden, komut düzeyi ayarlarını değiştirirken işler biraz daha karmaşıktır. InsertCommandBunun nedeni, özelliğindeki CommandCollection çeşitli komut nesnelerinin yanı sıra , UpdateCommandve DeleteCommandve olabilir. Komut düzeyi ayarlarını güncelleştirirken, bu ayarların tüm komut nesnelerine yayılması gerekir.

Örneğin, TableAdapter'da yürütülmesi çok uzun süren bazı sorgular olduğunu düşünün. TableAdapter kullanarak bu sorgulardan birini yürütürken komut nesnesinin CommandTimeout özelliğini artırmak isteyebiliriz. Bu özellik, komutun yürütülmesi için beklendiği saniye sayısını belirtir ve varsayılan olarak 30'a ayarlanır.

Özelliğin CommandTimeout BLL tarafından ayarlanmasına izin vermek içinProductsDataTable, Adım 2'de oluşturulan kısmi sınıf dosyasını kullanarak öğesine aşağıdaki Public yöntemi ekleyin (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

Bu yöntem, bu TableAdapter örneğinin tüm komut sorunları için komut zaman aşımını ayarlamak üzere BLL veya Sunu Katmanı'ndan çağrılabilir.

Not

Adapter ve CommandCollection özellikleri olarak Privateişaretlenir, yani bunlara yalnızca TableAdapter içindeki koddan erişilebilir. özelliğinden Connection farklı olarak, bu erişim değiştiricileri yapılandırılamaz. Bu nedenle, komut düzeyi özelliklerini mimarideki diğer katmanlarda kullanıma sunmanız gerekiyorsa, komut nesnelerini okuyan veya yazan bir Public yöntem veya özellik sağlamak için yukarıda açıklanan kısmi sınıf yaklaşımını Private kullanmanız gerekir.

Özet

Typed DataSet içindeki TableAdapters, veri erişim ayrıntılarını ve karmaşıklığını kapsüllemek için kullanılır. TableAdapters kullanarak veritabanına bağlanmak, komut vermek veya sonuçları bir DataTable'a doldurmak için ADO.NET kod yazma konusunda endişelenmemiz gerekmez. Her şey bizim için otomatik olarak işlenir.

Ancak, bağlantı dizesi veya varsayılan bağlantı ya da komut zaman aşımı değerlerini değiştirme gibi alt düzey ADO.NET ayrıntılarını özelleştirmemiz gereken zamanlar olabilir. TableAdapter otomatik olarak oluşturulan Connection, Adapterve CommandCollection özelliklerine sahiptir, ancak bunlar varsayılan olarak veya PrivateşeklindedirFriend. Bu iç bilgiler, yöntemleri veya özellikleri içerecek Public şekilde kısmi sınıflar kullanılarak TableAdapter genişletilerek ortaya çıkarılabilir. Alternatif olarak, TableAdapter'ın Connection özellik erişim değiştiricisi TableAdapter s ConnectionModifier özelliği aracılığıyla yapılandırılabilir.

Mutlu Programlama!

Yazar hakkında

Yedi ASP/ASP.NET kitabının yazarı ve 4GuysFromRolla.com kurucusu Scott Mitchell, 1998'den beri Microsoft Web teknolojileriyle çalışmaktadır. Scott bağımsız bir danışman, eğitmen ve yazar olarak çalışmaktadır. Son kitabı Sams Teach Yourself ASP.NET 24 Saat içinde 2.0. Adresine adresinden veya adresinden ulaşabileceğiniz http://ScottOnWriting.NETblogu aracılığıyla ulaşabilirsinizmitchell@4GuysFromRolla.com.

Özel Teşekkürler

Bu öğretici serisi birçok yararlı gözden geçiren tarafından gözden geçirildi. Bu öğreticinin baş gözden geçirenleri Burnadette Leigh, S ren Jacob Lauritsen, Teresa Murphy ve Hilton Geisenow'dur. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, bana bir satır mitchell@4GuysFromRolla.combırakın.