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

Scott Mitchell tarafından

Kodu indirin veya PDF 'yi indirin

Türü belirtilmiş veri kümesi içindeki TableAdapters otomatik olarak veritabanına bağlanma, komut verme ve sonuçlarıyla bir DataTable doldurma konusunda işlem gerçekleştirir. Ancak, bu ayrıntıların kendimize ve bu öğreticide, TableAdapter 'daki veritabanı bağlantısına ve komut düzeyi ayarlarına nasıl erişebileceğinizi öğreniyoruz.

Giriş

Eğitim Serisi boyunca, veri erişim katmanını ve katmanlı mimarimizin iş nesnelerini uygulamak için yazılan veri kümelerini kullandık. İlk öğreticideanlatıldığı gibi, yazılan veri kümesi verileri veri depoları olarak görev yapar, TableAdapters, temel alınan verileri almak ve değiştirmek üzere veritabanıyla iletişim kurmak için sarmalayıcılar olarak davranır. TableAdapters, veritabanıyla çalışma ile ilgili karmaşıklığı kapsüllendirir ve veritabanına bağlanmak, bir komut vermek veya sonuçları bir DataTable dosyasına doldurmak için kod yazmak zorunda kalmaktan kurtarır.

Bununla birlikte, TableAdapter derinliklerinde burte ve doğrudan ADO.NET nesneleriyle çalışacak kod yazmak zorunda olduğumuz durumlar vardır. Bir işlem öğreticisindeki sarmalama veritabanı değişikliklerine , örneğin, ADO.net işlemlerini başlatma, kaydetme ve geri alma için TableAdapter 'a Yöntemler ekledik. Bu yöntemler, TableAdapter s SqlCommand nesnelerine atanan bir iç, el ile oluşturulmuş SqlTransaction nesnesi kullanıyordu.

Bu öğreticide, TableAdapter 'ta veritabanı bağlantısına ve komut düzeyi ayarlarına nasıl erişeöğreneceksiniz. Özellikle, temel bağlantı dizesine ve komut zaman aşımı ayarlarına erişim sağlayan ProductsTableAdapter işlevsellik ekleyeceğiz.

ADO.NET kullanarak verilerle çalışma

Microsoft .NET Framework, verilerle çalışmak için özel olarak tasarlanmış sınıfların bir plethora içerir. System.Data ad alanıiçinde bulunan bu sınıflar, ADO.net sınıfları olarak adlandırılır. ADO.NET şemsiye altındaki sınıflardan bazıları belirli bir veri sağlayıcısınabağlıdır. Veri sağlayıcısını, ADO.NET sınıfları ve temel alınan veri deposu arasında bilgi akışına izin veren 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 tasarlanan sağlayıcıları da vardır. Örneğin, OleDb sağlayıcısı kullanılarak bir Microsoft SQL Server veritabanına bağlanmak mümkün olsa da, SqlClient sağlayıcısı, SQL Server için özel olarak tasarlandığından ve iyileştirildiğinden çok daha etkilidir.

Verilere programlı olarak erişirken, aşağıdaki model yaygın olarak kullanılır:

  1. Veritabanıyla bağlantı kurun.
  2. Bir komut verin.
  3. SELECT sorguları için, 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. Örneğin, SqlClient sağlayıcısını kullanarak bir veritabanına bağlanmak için SqlConnection sınıfınıkullanın. Veritabanına INSERT, UPDATE, DELETEveya SELECT komutu vermek için SqlCommand sınıfınıkullanın.

Işlem öğreticisindeki sarmalama veritabanı değişiklikleri dışında, TableAdapters otomatik oluşturulan kod, veritabanına bağlanmak, komut vermek, veri almak ve verileri DataTable 'a doldurmak için gereken işlevleri içerdiğinden, herhangi bir alt düzey ADO.net Code kendimize yazmak zorunda kaldık. Ancak, bu alt düzey ayarların özelleştirilmesi için gereken zamanlar olabilir. Sonraki birkaç adımda, TableAdapters tarafından dahili olarak kullanılan ADO.NET nesnelerine nasıl dokunduğunuzda inceleyeceğiz.

1. Adım: bağlantı özelliği ile Inceleme

Her TableAdapter sınıfı, veritabanı bağlantı bilgilerini belirten bir Connection özelliğine sahiptir. Bu özellik veri türü ve ConnectionString değeri, TableAdapter Yapılandırma sihirbazında yapılan seçimlere göre belirlenir. Türü belirtilmiş bir veri kümesine ilk olarak bir TableAdapter eklediğimiz durumlarda bu sihirbaz bize veritabanı kaynağını sorar (bkz. Şekil 1). Bu ilk adımdaki açılan liste, yapılandırma dosyasında belirtilen veritabanlarını ve Sunucu Gezgini s veri bağlantılarında diğer veritabanlarını içerir. Kullanmak istediğimiz veritabanı aşağı açılan listede yoksa, yeni bağlantı düğmesine tıklayıp gerekli bağlantı bilgilerini sağlayarak yeni bir veritabanı bağlantısı belirtilebilir.

TableAdapter Yapılandırma sihirbazının Ilk adımını

Şekil 1: TableAdapter Yapılandırma sihirbazının ilk adımı (tam boyutlu görüntüyü görüntülemek için tıklayın)

TableAdapter for Connection özelliği için kodu incelemeye biraz zaman atalım. Veri erişim katmanı oluşturma öğreticisinde belirtildiği gibi, otomatik olarak oluşturulan TableAdapter kodunu Sınıf Görünümü penceresine gidip, uygun sınıfa giderek ve ardından üye adına çift tıklayarak görüntüleyebiliriz.

Görünüm menüsüne gidip Sınıf Görünümü ' i 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ında NorthwindTableAdapters ad alanına gidin ve ProductsTableAdapter sınıfını seçin. Bu işlem, Şekil 2 ' de gösterildiği gibi ProductsTableAdapter s üyelerini Sınıf Görünümü alt yarısında görüntüler. Kodunu görmek için Connection özelliğine çift tıklayın.

Otomatik olarak oluşturulan kodu görüntülemek için Sınıf Görünümü bağlantı özelliğine çift tıklayın

Şekil 2: otomatik olarak oluşturulan kodu görüntülemek Için sınıf görünümü bağlantı özelliğine çift tıklayın

TableAdapter s 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şturulduğunda _connection üye değişkeni Nothingeşittir. Connection özelliğine erişildiğinde, önce _connection üye değişkeninin örneği oluşturulmuş olup olmadığını kontrol eder. Bu yoksa InitConnection yöntemi çağrılır, bu, _connection örnekleyen ve ConnectionString özelliğini TableAdapter Yapılandırma Sihirbazı s ilk adımından belirtilen bağlantı dizesi değerine ayarlıyor.

Connection özelliği bir SqlConnection nesnesine de atanabilir. Bunun yapılması, yeni SqlConnection nesnesini tek bir TableAdapter s SqlCommand nesneleri ile ilişkilendirir.

2. Adım: bağlantı düzeyi ayarlarını gösterme

Bağlantı bilgileri TableAdapter içinde kapsüllenmelidir ve uygulama mimarisinde diğer katmanlara erişemez. Ancak, TableAdapter bağlantı düzeyi bilgilerinin bir sorgu, Kullanıcı veya ASP.NET sayfası için erişilebilir veya özelleştirilebilir olması gerektiğinde senaryolar olabilir.

Northwind veri kümesindeki ProductsTableAdapter, TableAdapter tarafından kullanılan bağlantı dizesini okumak veya değiştirmek için Iş mantığı katmanı tarafından kullanılabilecek bir ConnectionString özelliği içerecek şekilde genişletmenize olanak tanır.

Note

Bağlantı dizesi , kullanılacak sağlayıcı, veritabanının konumu, kimlik doğrulama 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 veri kümesinin otomatik olarak oluşturulan sınıfları kısmi sınıfların kullanımı aracılığıyla Genişletilebilir. İlk olarak, ~/App_Code/DAL klasörünün altında ConnectionAndCommandSettings adlı projede yeni bir alt klasör oluşturun.

ConnectionAndCommandSettings adında bir alt klasör ekleyin

Şekil 3: ConnectionAndCommandSettings adlı bir alt klasör ekleme

ProductsTableAdapter.ConnectionAndCommandSettings.vb adlı 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 ProductsTableAdapter sınıfına ConnectionString adlı Public özelliği ekler. Bu, herhangi bir katmanın, ilişkili olan bağlantı dizesini okumasına veya güncelleştirmesine izin verir.

Bu kısmi sınıf oluşturulur (ve kaydedildiğinde), ProductsBLL sınıfını açın. Mevcut yöntemlerden birine gidin ve Adapter yazın ve ardından IntelliSense 'i getirmek için period tuşuna basın. IntelliSense 'de yeni ConnectionString özelliğini görmeniz gerekir, yani bu değeri BLL 'den programlama yoluyla okuyabilmeniz veya ayarlayabilmelisiniz.

Tüm bağlantı nesnesi gösteriliyor

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 'ın sınırlarının ötesinde kullanılabilir hale getirmek istiyorsanız, Connection özellik s koruma düzeyini değiştirebilirsiniz. Adım 1 ' de incelenen otomatik oluşturulan kod, TableAdapter s Connection özelliğinin Friendolarak işaretlendiğinden, yani yalnızca aynı derlemede bulunan sınıflar tarafından erişilebileceği anlamına geliyor. Bununla birlikte, TableAdapter s ConnectionModifier özelliği aracılığıyla bu değiştirilebilir.

Northwind veri kümesini açın, tasarımcıda ProductsTableAdapter tıklayın ve Özellikler penceresi gidin. ConnectionModifier, Assemblyvarsayılan değerine ayarlandığını görürsünüz. Connection özelliğini, türü belirtilmiş DataSet s derlemesinin dışında kullanılabilir hale getirmek için, ConnectionModifier özelliğini Publicolarak değiştirin.

Bağlantı özelliği s erişilebilirlik düzeyi ConnectionModifier özelliği aracılığıyla yapılandırılabilir

Şekil 4: Connection Property s erişilebilirlik düzeyi ConnectionModifier özelliği aracılığıyla yapılandırılabilir (tam boyutlu görüntüyü görüntülemek için tıklayın)

Veri kümesini kaydedin ve sonra ProductsBLL sınıfına geri dönün. Daha önce olduğu gibi, mevcut yöntemlerden birine gidin ve Adapter yazın ve ardından IntelliSense 'i getirmek için period tuşuna basın. Liste, artık BLL 'den herhangi bir bağlantı düzeyindeki ayarı program aracılığıyla okuyabilmeniz veya atayabilmeniz için bir Connection özelliği içermelidir.

TableAdapter, varsayılan olarak otomatik olarak oluşturulan INSERT, UPDATEve DELETE deyimlerini içeren bir ana sorgudan oluşur. Bu ana sorgu s INSERT, UPDATEve DELETE deyimleri, Adapter özelliği aracılığıyla TableAdapter s kodunda bir ADO.NET veri bağdaştırıcısı nesnesi olarak uygulanır. Connection özelliği ile benzer şekilde, Adapter özellik s veri türü kullanılan veri sağlayıcısı tarafından belirlenir. Bu öğreticiler SqlClient sağlayıcısını kullandığından Adapter özelliği SqlDataAdaptertüründedir.

TableAdapter s Adapter özelliği, SqlCommand türünde INSERT, UPDATEve DELETE deyimlerini vermek için kullandığı üç özelliğe sahiptir:

  • InsertCommand
  • UpdateCommand
  • DeleteCommand

SqlCommand nesnesi, veritabanına belirli bir sorgu göndermekten sorumludur ve şu şekilde özelliklere sahiptir: CommandText, örneğin, geçici SQL ifadesini veya yürütülecek saklı yordamı içeren. ve bir SqlParameter nesneleri koleksiyonu olan Parameters. Veri erişim katmanı oluşturma öğreticisinde geri döndüğünüzde, bu komut nesneleri Özellikler penceresi aracılığıyla özelleştirilebilir.

TableAdapter, ana sorgusuna ek olarak, çağrıldığında, belirtilen bir komutu veritabanına gönderse, bir değişken sayıda yöntem içerebilir. Ana sorgu s komut nesnesi ve tüm ek yöntemler için komut nesneleri TableAdapter s CommandCollection özelliğinde depolanır.

Bu iki özellik ve destekleyici üye değişkenleri ve yardımcı yöntemleri için Northwind veri kümesindeki ProductsTableAdapter tarafından oluşturulan koda bakmak için bir süre bekleyin:

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

Adapter ve CommandCollection özelliklerinin kodu Connection özelliğini yakından taklit eder. Özellikler tarafından kullanılan nesneleri tutan üye değişkenleri vardır. Özellikler Get erişimcileri, ilgili üye değişkeninin Nothingolup olmadığı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: komut düzeyi ayarları gösterme

İdeal olarak, komut düzeyi bilgileri veri erişim katmanında kapsüllenmelidir. Bu bilgilerin mimarinin diğer katmanlarında olması gerekir, ancak tıpkı bağlantı düzeyi ayarları gibi kısmi bir sınıf aracılığıyla sunulabilir.

TableAdapter yalnızca tek bir Connection özelliğine sahip olduğundan, bağlantı düzeyi ayarlarını gösterme kodu oldukça basittir. TableAdapter, bir InsertCommand, UpdateCommandve DeleteCommand, CommandCollection özelliğindeki çeşitli komut nesneleriyle birlikte birden çok komut nesnesine sahip olabileceğinden, komut düzeyi ayarları değiştirirken bu işlemler biraz daha karmaşıktır. Komut düzeyi ayarları güncelleştirilirken, bu ayarların tüm komut nesnelerine yayılmalıdır.

Örneğin, TableAdapter 'ta yürütülmesi için olağandışı uzun süre geçen belirli sorgular olduğunu düşünün. Bu sorgulardan birini yürütmek için TableAdapter kullanılırken, komut nesne s CommandTimeout özelliğiniartırmak isteyebilirsiniz. Bu özellik, komutun yürütülmesi için bekleyeceği saniye sayısını ve varsayılan olarak 30 değerini belirtir.

CommandTimeout özelliğinin BLL tarafından ayarlanmasına izin vermek için, adım 2 ' de oluşturulan kısmi sınıf dosyasını kullanarak ProductsDataTable aşağıdaki Public yöntemini 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ği tarafından tüm komut sorunları için komut zaman aşımını ayarlamak üzere BLL veya Presentation katmanından çağrılabilir.

Note

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

Özet

Türü belirtilmiş veri kümesi içindeki TableAdapters veri erişimi ayrıntılarını ve karmaşıklığını kapsüllemek için işlev yapar. TableAdapters kullanarak, veritabanına bağlanmak, bir komut vermek veya sonuçları bir DataTable dosyasına doldurmak için ADO.NET kodu yazma konusunda endişelenmenize gerek yoktur. Hepsi sizin için otomatik olarak işlenir.

Ancak, bağlantı dizesini veya varsayılan bağlantıyı veya komut zaman aşımı değerlerini değiştirme gibi alt düzey ADO.NET özelliklerini özelleştirmek için gereken durumlar olabilir. TableAdapter otomatik olarak oluşturulan Connection, Adapterve CommandCollection özelliklerine sahiptir, ancak bunlar varsayılan olarak Friend veya Private. Bu iç bilgiler, Public Yöntemler veya özellikler dahil olmak üzere kısmi sınıflar kullanılarak TableAdapter genişleterek ortaya çıkabilir. Alternatif olarak, TableAdapter s Connection özellik erişim değiştiricisi TableAdapter s ConnectionModifier özelliği aracılığıyla yapılandırılabilir.

Programlamanın kutlu olsun!

Yazar hakkında

4GuysFromRolla.com 'in, Scott Mitchell, yedi ASP/ASP. net books ve 'in yazarı, 1998 sürümünden bu yana Microsoft Web teknolojileriyle çalışmaktadır. Scott bağımsız danışman, Trainer ve yazıcı olarak çalışıyor. En son kitabı, 24 saat içinde ASP.NET 2,0 kendi kendinize eğitimister. mitchell@4GuysFromRolla.comadresinden erişilebilir . ya da blog aracılığıyla http://ScottOnWriting.NETbulabilirsiniz.

Özel olarak teşekkürler

Bu öğretici serisi birçok yararlı gözden geçirenler tarafından incelendi. Bu öğreticide lider gözden geçirenler Burnadette Leigh, S Ren Jacob Lauritsen, Teresa Murphy ve Tepton Geisenow. Yaklaşan MSDN makalelerimi gözden geçiriyor musunuz? Öyleyse, benimitchell@4GuysFromRolla.combir satır bırakın .