Veri Erişim Katmanının Bağlantısını ve Komut Düzeyi Ayarlarını Yapılandırma (VB)
tarafından Scott Mitchell
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:
- Veritabanıyla bağlantı kurun.
- Bir komut gönderin.
- 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
, DELETE
veya 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.
Ş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
.
Ş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 _connection
ConnectionString
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 ProductsTableAdapter
Northwind
, 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.
Ş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 Friend
iş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 Assembly
ayarlanmış 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 Public
değiştirinConnectionModifier
.
Ş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.
3. Adım: Command-Related Özelliklerini inceleme
TableAdapter, varsayılan olarak otomatik olarak oluşturulan INSERT
, UPDATE
ve DELETE
deyimlerini içeren bir ana sorgudan oluşur. Bu ana sorgunun INSERT
, UPDATE
ve 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
, , UPDATE
ve DELETE
deyimlerini vermek INSERT
iç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 Parameters
bir 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 Nothing
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: 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. InsertCommand
Bunun nedeni, özelliğindeki CommandCollection
çeşitli komut nesnelerinin yanı sıra , UpdateCommand
ve DeleteCommand
ve 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 Private
iş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
, Adapter
ve 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.