Makale Özeti

ADO ‘dan, ADO .NET ‘e geçen pek çok programcının ilk eleştirisi, DataSet nesnesinin Recordset nesnesine göre daha zor bir kullanım modeli sunmasıdır. Örneğin DataSet içerisinde bulunan bir tablodaki, herhangi bir kaydın, belirlenen bir alanındaki değeri almak istediğinizde, oldukça uzun bir kod satırı yazmak zorunda kalırsınız. Aşağıdaki kod parçasında, “Customers” tablosundaki ilk kaydın, “CompanyName” isimli alanındaki değer alınarak, “txtCompany” isimli textbox ’a yazdırılmıştır.

Makale

ADO ‘dan, ADO .NET ‘e geçen pek çok programcının ilk eleştirisi, DataSet nesnesinin Recordset nesnesine göre daha zor bir kullanım modeli sunmasıdır. Örneğin DataSet içerisinde bulunan bir tablodaki, herhangi bir kaydın, belirlenen bir alanındaki değeri almak istediğinizde, oldukça uzun bir kod satırı yazmak zorunda kalırsınız. Aşağıdaki kod parçasında, “Customers” tablosundaki ilk kaydın, “CompanyName” isimli alanındaki değer alınarak, “txtCompany” isimli textbox ’a yazdırılmıştır.

txtCompany.Text = Ds.Tables(“Customers”).Rows(0).Item(“CompanyName”)

Oysa aynı işlem ADO ‘daki Recordset nesnesi ile yapılıyor olsaydı, aşağıda örneklendiği gibi, görece çok daha kısa bir kod satırı yazmak yeterli olacaktı.

txtCompany.Text = Rs.Fields(“CompanyName”).Value

DataSet nesnesinin kullanım tarzındaki bu zorluğun nedeni; şüphesiz DataSet sınıfının tasarımında aranmalıdır. Ancak ADO .NET bizi bu konuda tamamen çaresiz bırakmak yerine, “Strongly Typed DataSet” olarak anılan bir çözüm sunuyor. Strongly Typed Dataset ‘ler teknik olarak; DataSet taban sınıfından türetilmiş özel DataSet sınıflarıdır. Strongly Typed DataSet ‘ler (türemiş DataSet sınıfları) şema bilgisinde bulunan tablo, kayıt gibi varlıkları, özgün property ’lerle temsil edebilme yeteneğine sahiptir. Örneğin DataSet taban sınıfından türetilen “dsCustomers” isimli türemiş DataSet sınıfı, “Customers” tablosundaki kayıtları ve bu kayıtlara ait alanları, özgün property ‘ler ile temsil edebilmektedir. Bu durumda;

txtCompany.Text = Ds.Tables(“Customers”).Rows(0).Item(“CompanyName”)

gibi uzun bir kod satırı yazmak yerine;

txtCompany.Text = tDs.Customers(0).CompanyName

gibi görece daha kısa bir kod yazılarak, aynı işlem gerçekleştirilmiş olunur.

NOT : tDs nesnesi, “dsCustomers” sınıfı türünde bir nesnedir.

Strongly Typed DataSet ‘lerin Oluşturulması

Bu amaçla kullanılan iki yöntem vardır. Birincisi Visual Studio .NET geliştirme ortamında yer alan “DataSet Designer” isimli aracın kullanımı ile gerçekleştirilir.

“Project” menüsünden “Add New Item” seçeneğini seçtiğinizde, karşınıza “Add New Item” başlıklı, diyalog penceresi açılacaktır. Makalede verilen örnek için, bu pencereden “DataSet” seçip, “Name” kısmına “dsCategories.xsd” girin. “dsCategories” DataSet taban sınıfından türetilecek sınıfın ismi olacak. Daha sonra “Solution Explorer” penceresinden, “Servers” > “SQLServers” > “[Server_İsmi]” > “Northwind” > “Tables” > “Categories” tablosunu bulun ve design penceresi üzerine sürükleyin. Böylece “Categories” tablosunun şema bilgilerinin, “dsCategories.xsd” dosyası içerisine otomatik olarak eklenmesini sağlamış oldunuz. Aşağıdaki, şekilde söz konusu şema bilgilerinin görsel olarak düzenlenebileceği design penceresi görülmektedir.

Şekil 1

NOT : Bu konunun başında Strongly Typed Dataset ‘lerin oluşturulması amacı ile kullanılan iki farklı yöntemin olduğundan söz etmiş ve ilk yöntemi örnekleyerek anlatmıştık. Ancak ilk yöntemin uygulanabilmesi için, Visual Studio .NET IDE ‘sinin sistemde mutlaka bulunması gerekir. Oysa .NET uygulamalarının geliştirilmesi için, Visual Studio .NET IDE ‘sinin olması bir zorunluluk değildir. .NET uygulamalarının derlenmesi gibi pek çok işlem, aslında .NET Framework SDK ‘da bulunan çeşitli araçlarla yapılabilir. Aynı şey Strongly Typed Dataset ‘lerin oluşturulması için de söz konusudur. Strongly Typed DataSet ‘lerin oluşturulması amacı ile .NET Framework SDK ‘ya “XSD.exe” isimli bir araç eklenmiştir. XSD.exe komut satırından çalıştırılarak kullanılan bir araçtır. XSD.exe isimli aracın yaptığı temel işlem; komut satırında ilk parametresine girilen “.xsd” uzantılı şema dosyasını kullanarak, “.vb” uzantılı ve Strongly Typed DataSet sınıfı içeren bir modül dosyası yaratmaktır.

XSD.EXE C:\Urunler.xsd /d /l:VB

Strongly Typed DataSet‘lerin Kullanılması

Strongly Typed DataSet ‘lerin kullanılması aslında, normal DataSet‘lerin kullanılmasından çok da farklı değildir. Çünkü Strongly Typed DataSet‘ler, DataSet taban sınıfındaki tüm metot, property ve event gibi üyeleri türetme işlemi sayesinde miras olarak almaktadır. Miras alınan standart üyelerin yanı sıra, Strongly Typed DataSet sınıfları, içerdikleri bir takım yeni üyeler sayesinde daha kolay ve anlaşılabilir bir programlama modeli sağlar.

Örnek : Aşağıdaki uygulamada daha önce oluşturduğumuz “dsCategories” isimli sınıf türündeki oDs isimli nesnenin temsil ettiği bellek bölgesine, Northwind veri tabanındaki Categories tablosunda bulunan kayıtlar alınmış ve daha sonra sekizinci kaydın “CategoryName” isimli alanındaki değer bir message box aracılığı ile kullanıcıya gösterilmiştir.

Dim cnnStr As String
cnnStr = "initial Catalog=Northwind;Data Source=localhost;integrated security=sspi"
Dim oCnn As SqlConnection
oCnn = New SqlConnection(cnnStr)
oCnn.Open()

Dim oAdp As SqlDataAdapter
oAdp = New SqlDataAdapter()
Dim sSql As String sSql = "Select * From Categories"
oAdp.SelectCommand = New SqlCommand(sSql, oCnn)

Dim oDs As New dsCategories()
oAdp.Fill(oDs.Categories)
MsgBox(oDs.Categories(7).CategoryName)
 

Fill() metodunun kullanılışında dikkat etmemiz gereken nokta; oDs.Categories ifadesi kullanılarak, veri tabanından alınan kayıtların “Categories” property ‘si ile temsil edilen tabloya aktarılmış olmasıdır. Bu kayıtlardan sekizincisine ait, “CategoryName” isimli alandaki değerin alınışı ise aşağıda parça parça incelenmiştir;

MsgBox(oDs.Categories(7).CategoryName)

oDs.Categories : oDs nesnesi ile temsil edilen bellek bölgesindeki, “Categories” tablosunun,
oDs.Categories(7) : Sekizinci kaydına ait,
oDs.Categories(7).CategoryName : “CategoryName” isimli alandaki değer.


Aykut TAŞDELEN

aykuttasdelen@yazgelistir.com