Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
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 üstleniyor. Ancak bu ayrıntıları kendimiz halletmek istediğimiz durumlar vardır ve bu öğreticide TableAdapter'daki 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'in DataTables'i veri depoları olarak işlev görürken, TableAdapters temel verileri almak ve değiştirmek için veritabanıyla iletişim kuran bir aracı rolü üstlenir. 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 nesneleriyle ç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 SqlTransaction
nesnelerine atanmış, el ile oluşturulmuş SqlCommand
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 alınan bağlantı dizesine ProductsTableAdapter
ve komut zaman aşımı ayarlarına erişim sağlayan işlevler 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ını sağlayan 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.
-
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. SqlClient sağlayıcısını kullanarak bir 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 Veritabanı Değişikliklerini Sarmalama dışında, alt düzey ADO.NET kodu kendimiz yazmamız gerekmez. Ancak, bu düşük düzeyli 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 Veri Bağlantıları'ndaki diğer veritabanlarını içerir. Kullanmak istediğimiz veritabanı açılan listede yoksa, Yeni Bağlantı düğmesine tıklanarak ve 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 özelliğinin Connection
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, ProductsTableAdapter
sınıfının üyelerini Sınıf Görünümünün alt yarısında görüntüler. Kodunu görmek için özelliğine çift tıklayın Connection
.
Şekil 2: Sınıf Görünümünde Bağlantı Özelliği Double-Click'ı kullanarak Otomatik Oluşturulan Kodunu Görüntüleyin
TableAdapter özelliği Connection
ve bağlantıyla ilgili diğer kodlar şunlardır:
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ı örneklendiğinde, üye değişkeni _connection
eşittir Nothing
. Özellik Connection
erişildiğinde, önce _connection
üye değişkeninin örneklendiğini denetler. Aksi takdirde, InitConnection
yöntemi çağrılır. Bu çağrı, _connection
örneğini oluşturur ve ConnectionString
özelliğini, TableAdapter Yapılandırma Sihirbazı'nın ilk adımında belirtilen bağlantı dizesi değerine ayarlar.
Connection
Özelliği bir SqlConnection
nesneye de atanabilir. Bunu yapmak, yeni SqlConnection
nesneyi TableAdapter nesnelerinin SqlCommand
her biriyle ilişkilendirir.
2. Adım: Connection-Level Ayarlarını Ortaya Çıkarma
Bağlantı bilgileri TableAdapter içinde kapsüllenmiş olarak kalmalı ve uygulama mimarisindeki diğer katmanlar tarafından erişilmemelidir. Ancak TableAdapter'ın bağlantı düzeyi bilgilerinin sorgu, kullanıcı veya ASP.NET sayfası için erişilebilir veya özelleştirilebilir olması gerektiği senaryolar olabilir.
DataSet içindeki ProductsTableAdapter
öğesiniNorthwind
, TableAdapter tarafından kullanılan bağlantı dizesini okumak veya değiştirmek için İş Mantığı Katmanı tarafından kullanılabilecek bir ConnectionString
özellik içerecek şekilde genişletelim.
Uyarı
Bağlantı dizesi, kullanılacak sağlayıcı, veritabanının konumu, kimlik doğrulama 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 ConnectionAndCommandSettings
adlı ~/App_Code/DAL
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 TableAdapter'ın temel bağlantısı için bağlantı dizesini okumasını veya güncellemesini sağlayan Public
adlı bir ConnectionString
özelliğini ProductsTableAdapter
sınıfına ekler.
Bu kısmi sınıf oluşturulduktan (ve kaydedildikten) sonra ProductsBLL
sınıfını açın. Mevcut yöntemlerden birine gidin ve Adapter
yazın, ardından IntelliSense'i açmak için nokta tuşuna basın. IntelliSense'te yeni özelliğin kullanılabilir olduğunu görmeniz ConnectionString
gerekir. Bu, BLL'den bu değeri program aracılığıyla okuyabileceğiniz veya ayarlayabildiğiniz anlamına gelir.
Bağlantı Nesnesinin Tamamını Ortaya Çı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ının ötesinde 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 s ConnectionModifier
özelliği aracılığıyla değiştirilebilir.
Northwind
DataSet'i açın, Tasarımcı'daki ProductsTableAdapter
öğesine tıklayın ve Özellikler penceresine gidin. Burada, ConnectionModifier
ayarının varsayılan değeri olan Assembly
değerini görürsünüz. Typed DataSet derlemesinin dışında Connection
özelliğini kullanılabilir hale getirmek için, ConnectionModifier
özelliğini Public
olarak değiştirin.
Ş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, Adapter
yazın ve ardından IntelliSense'i açmak için nokta tuşuna basın. Liste bir özellik içermelidir; yani 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
deyimlerine sahip bir ana sorgudan oluşur. Bu ana sorgunun INSERT
, UPDATE
ve DELETE
deyimleri, TableAdapter kodunda Adapter
özelliği aracılığıyla 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 Adapter
özelliği, SqlCommand
, INSERT
ve UPDATE
deyimlerini vermek amacıyla kullandığı üç DELETE
ö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. Ana sorgunun komut nesnesi ve tüm ek yöntemlerin komut nesneleri TableAdapter s CommandCollection
özelliğinde depolanır.
Biraz durup bu iki özellik ve onların destekleyici üye değişkenleri ve yardımcı yöntemleri için ProductsTableAdapter
DataSet'te Northwind
tarafından oluşturulan koda bakalı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
Adapter
ve CommandCollection
özelliklerinin kodu, Connection
özelliğinin kodunu yakından taklit eder. Özellikler tarafından kullanılan nesneleri tutan üye değişkenleri mevcuttur. Ö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ı Ortaya Çı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ı gibi kısmi bir sınıf aracılığıyla kullanıma sunulur.
TableAdapter yalnızca tek Connection
bir özelliğe sahip olduğundan, bağlantı düzeyi ayarlarının kullanıma sunulurken kullanılacak kod oldukça basittir. TableAdapter'daki çeşitli sayıda komut nesnesinin yanı sıra, InsertCommand
, UpdateCommand
, ve DeleteCommand
gibi birden çok komut nesnesi olabileceği için komut seviyesi ayarlarını değiştirirken işler biraz daha karmaşıktır. 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 olağanüstü uzun zaman alan bazı sorgular olduğunu düşünün. TableAdapter'ı kullanarak bu sorgulardan birini yürütürken komut nesnesinin sCommandTimeout
özelliğini artırmak isteyebiliriz. Bu özellik, komutun yürütülmesini beklemek için saniye sayısını belirtir ve varsayılan olarak 30'dur.
Özellik CommandTimeout
'nın BLL tarafından ayarlanmasına izin vermek için, 2. Adımda (Public
) oluşturulan kısmi sınıf dosyasını kullanarak ProductsDataTable
öğesine aşağıdaki ProductsTableAdapter.ConnectionAndCommandSettings.vb
yöntemini ekleyin.
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ğindeki tüm komut sorunları için komut zaman aşımını ayarlamak üzere BLL veya Sunu Katmanı'ndan çağrılabilir.
Uyarı
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 katmanlara 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ı DataTable'a doldurmak için ADO.NET kodu yazma konusunda endişelenmemiz gerekmez. Her şey bizim için otomatik olarak işlenir.
Ancak, bağlantı dizesini 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 ya Friend
ya da Private
'dır. 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ışır. Son kitabı Sams Teach Yourself ASP.NET 24 Hours 2.0'dır. Ona adresinden mitchell@4GuysFromRolla.comulaşabilirsiniz.
Özel Teşekkürler
Bu eğitim serisi, birçok yararlı kişi tarafından incelendi. Bu öğreticinin baş gözden geçirenleri Burnadette Leigh, S ren Jacob Lauritsen, Teresa Murphy ve Hilton Geisenow oldu. Yaklaşan MSDN makalelerimi gözden geçirmek istiyor musunuz? Öyleyse, mitchell@4GuysFromRolla.com'a bir mesaj bırakın.