![]() | |
ADO .NET 2.0 İle Gelen Yenilikler -4 | 21.12.2004 |
| Kategori : .NET Framework Özet : DataSet & DataTable sınıflarına ilişkin değişiklikler. Aykut TAŞDELEN | |
ADO .NET 2.0 İle Gelen Yenilikler -4 Dataset & DataTable Sınıflarına İlişkin Temel Değişiklikler
Dataset & Binary Serialization Özellikle kurumsal ölçekte yazılan ve çok katmanlı mimarilerin
kullanıldığı uygulamalarda, katmanlar arasındaki veri iletişiminin son derece
efektif olması istenir. Veri iletişiminde efektiflik, hem iletişim
hızı hem de iletilen veri boyutunun makul sınırlar içinde olmasıdır.
Programcıların iletişim hızı ya da band genişliği gibi argümanlar üzerinde çok
da fazla inisiyatifleri olamayacağı gerçeği göz önüne alındığında, programcının
efektiflik adına fark yaratabileceği tek argüman; veri boyutunun
sınırlandırılmasıdır.
Konuya .NET perspektifinden bakılırsa, iletilmek istenen verinin
DataSet olması durumunda, programcının veri boyutları üzerinde de yapabileceği
fazla birşey kalmadığı görülecektir. Bu durum özellikle Remoting konusunda
daha da dramatik sonuçlara neden olmaktadır. Zira bir DataSetin içeriği,
binary serialization işlemine tabi tutulsa dahi kaçınılmaz olarak veri
yine XML formatında ifade edilmektedir. Sonuçta bu durum, verinin
boyutlarında (yaklaşık) üç katlık bir artışa neden
olmaktadır.
DataSetin başından beri eleştirilen bu olumsuzluk, ADO.NET 2.0
da sınıfa eklenen RemotingFormat isimli bir property
sayesinde bertaraf edilmiştir. Böylece DataSet üzerinde gerçek anlamda
binary serialization yapabilmek mümkün hale gelmiştir.
Örnek : Aşağıdaki
uygulamada veri tabanından alınan kayıtlarla doldurulan bir DataSet, binary
serialization işlemine tabi tutulmaktadır. RemotingFormat propertysine
SerializationFormat.Binary değeri atanarak uygulama çalıştırıldığında elde
edilen dosya büyüklüğü yaklaşık 139 KB iken, SerializationFormat.Xml değeri
atanarak çalıştırıldığında elde edilen dosya büyüklüğü yaklaşık 453
KB olduğu gözlenmiştir.
Remoting performansı hakkında ise, (1000 kaydın üzerinde)
SerializationFormat.Binary değeri kullanıldığında, yaklaşık 80 katlık bir
artıştan söz edilebilir.
static void Main(string[] args)
// serialization işlemi BinaryFormatter format = new
BinaryFormatter();
format.Serialize(fs, ds);
Dataset - DataReader Entegrasyonu
Çalışma şekilleri açısından, birbirlerinden tümüyle farklı
iki paradigmanın temsilcisi durumunda olan bu sınıflar, (izole
tasarımları nedeniyle) içerdikleri verilerin kendi aralarındaki
transferine imkan sağlamamaktaydı. Oysa söz konsusu
sınıflara ADO.NET 2.0 da yapılan eklentiler, birbirlerinden çok farklı iki
yaklaşımı öngören bu sınıfların entegrasyonunu mümkün kılmıştır.
Dataset ve DataTable sınıflarına eklenen Load() isimli üye fonksiyon;
parametresine aldığı IDataReader referansının temsil ettiği bellek bölgesindeki
kayıtların, Dataset ya da DataTable içerisine aktarımını sağlar. public void Load(IDataReader reader, LoadOption
loadOption, DataTable[] tables);
Örnek :
SqlConnection cnn = new SqlConnection("data
source=localhost; initial catalog=Northwind;
SqlCommand cmd = new SqlCommand("Select * From
Employees", cnn); SqlDataReader dr = cmd.ExecuteReader(); Dataset ds = new Dataset(); ds.Load(dr); DataTableReader Sınıfı Kütüphaneye yeni eklenen bu somut sınıf, bellekteki bir (veya daha
fazla) DataTable nesnesi içerisinde var olan kayıtları, üzerinde salt ve
ileri yönde okuma yapılabilen bir kayıt seti biçiminde elde etmeyi
sağlamaktadır. Tanımdan da anlaşılacağı gibi bu sınıfın çalışma
mekanizması ve içsel tasarımı, DataReaderı andırmaktadır. Zaten söz
konusu sınıf DbDataReader isimli taban sınıftan türetilmiştir. Örnek : SqlConnection cnn = new SqlConnection("data
source=localhost; initial catalog=Northwind;
SqlCommand cmd = new SqlCommand("Select
EmployeeID, LastName, FirstName From Employees", cnn);
SqlDataAdapter adp = new SqlDataAdapter(cmd);
DataSet ds = new DataSet(); adp.Fill(ds);
cnn.Close(); DataTableReader dtr = new
DataTableReader(ds.Tables[0]);
while (dtr.Read())
Not : Örnekte
DataTableReader nesnesinin yaratılışı için, sınıfın başlangıç
fonksiyonuna (constructorına) parametre olarak, üzerinden okuma yapılacak
DataTable nesnesinin referansının geçildiği görülmektedir. Bu işlem
DataTableReader ile DataTable ın ilişkilendirilmesini sağlamaktadır. Ancak
nesnenin yaratılışı için alternatif olarak, DataSet ya da
DataTable sınıflarına ait GetDataReader() isimli fonksiyon da
kullanılabilir. Zira bu fonksiyon, DataTableReader sınıfı türünde bir nesne
referansı döndürmektedir. Bu bağlamda aynı işlem aşağıdaki gibi de
yapılabilirdi : DataTableReader dtr =
ds.Tables[0].GetDataReader();
Aykut TAŞDELEN VB.NET MVP (MS Most Valuable Professional) | |
Yazgelistir.com | |