Bildiğimiz gibi dataset nesneleri sanal veritabanları
olarak tabir edebileceğimiz veri tabanından bağımsız çalışan, veritabanlarındaki
gibi birden fazla tablo barındırabilen ve bu tablolar içerisindeki kayıtlar arasında
ilişki kurabilen veri blokları dır.
Bu yazıdaki hedefimiz datasetlerin kullanımını
öğrenmek değil. Bu yüzden dataset hakkında belli bilgiye sahip olduğunuzu
varsayıyorum.
Veritabanı güncellemelerini dataset nesnesi
kullanmadan da yapmak mümkün; bunun en basit şekli Command nesnemiz in ExecuteNonQuery metodunu kullanmak. Ancak programlarımızda dataset nesneleri
kullanıyorsak bu nesneler üzerindeki değişikleri de veritabanımıza geri
yansıtmamız mümkün.
- DataAdapter’ dan Dataset’ e Bilgi Aktarımı
Dataset’ i veritabanı bilgileri ile doldurmak için .NET data sağlayıcıları kendi DataAdapter’ larını kullanmak zorundadırlar: OLE DB .NET data sağlayıcısı için OleDbDataAdapter nesnesi ve SQL Server .NET data sağlayıcısı içinse SqlDataAdapter nesnesi kullanılır. Bu doldurma işleminin yapılması için DataAdapter’ ın Fill metodu kullanılır. Örneğin: (Sql Server için)
DataSet ds=new DataSet();
SqlConnection cnn=new
SqlConnection("server=local\\vsdotnet;trusted_connection=yes;database=northwind");
SqlDataAdapter da=new SqlDataAdapter("select * from
categories",cnn);
cnn.open()
da.Fill(ds,"categories");
cnn.close();
Bu komut blokunda görüleceği üzere önce northwind
veritabanı ile bağlantımızı kuruyor, daha sonra SqlDataAdapter nesnemiz in yapıcısına Select sql komutumuzu yazarak veri kaynağımıza bağlıyoruz. Burada
dikkat etmemiz gereken, SqlDataAdapter yazıcısındaki sql komut parametresinin
mutlaka Select sql komutu olmasıdır. Daha sonra “categories” tablosundaki
verileri ds adlı dataset nesnesine aktarmak için Fill metodumuzu kullanılıyoruz Fill metod parametresinde kullandığımız “categories” dataset’
in içerisindeki tablonun ismidir. Bu opsiyoneldir, istersek tablo ismi vermeden
de dataset doldurabiliriz. Bu durumda dataset tabloya default olarak “table”
ismini verir. Neyse çok fazla uzatmadan datasetten veritabanı güncellemesine
geçmek istiyorum. Şimdiye kadar yaptıklarımız hepsi birer hazırlık aşamasıydı.
- Dataset Güncellemeleri
Güncelleme dediğimizde aklımıza aslında dataset’ e
yeni kayıt ekleme, kayıt silme, kayıt güncelleme gibi terimler gelmesi
gerekiyor. Yukarıda doldurduğumuz dataset üzerinde şimdi değişiklik yapacağız
ve bu değişiklilerin nasıl veri tabanına geri yansıtıldığını göreceğiz.
Öncelikle biraz teknik bilgi:
Öncelikle biraz teknik bilgi:
Dataset’ te yapılan değişikler, veri tabanına Update metodu ile gönderilir. Bu olayın nasıl gerçekleştiğini şu örnekle inceleyelim.
Dataset içerisine aktarılan veriler şöyle olsun:
(RowState)
|
CustomerID
|
Name
|
Status
|
(Unchanged)
|
C200
|
Robert Lyan
|
Good
|
(Unchanged)
|
C400
|
Nancy Buchanan
|
Pending
|
Uygulamamızda “C400” CustomerID’ li müşterimizin
Status bilgisini DataSet içerisinde “Preffered” olarak değiştirdik diyelim. Bu
değişiklik sonucunda DataRow.RowState özelliği, değişen satırlar için
Unchanged’ den Modified’ a döner. Yani DataSet içeriği söyle olur:
(RowState)
|
CustomerID
|
Name
|
Status
|
(Unchanged)
|
C200
|
Robert Lyan
|
Good
|
(Modified)
|
C400
|
Nancy Buchanan
|
Preffered
|
İşte bu sırada DataAdapter nesnemiz in Update metodunu
çalıştırdığımızda, Update metodu her satırı denetler. İlk satır için veri tabanına hiçbir Sql komutu gönderilmez, çünkü RowState özelliğinin değeri
“Unchanged” olarak kalmıştır. Buradaki RowState özelliği DataSet’ i oluşturan
DataTable nesnesinin her DataRow nesnesinde bulunan bir özelliktir. Ancak
ikinci satır için, Update metodu otomatik olarak komutu uyarır ve bu komutu
veritabanı gönderip orada işlettirir. Bu komutu uyarma işlemi kafanızı
karıştırmış olabilir: Update metodu RowState özelliğindeki duruma göre
DataAdapter nesnemizde tanımladığımız komutu arar ve onu çağırır: RowState özelliği
değişen satırlar için Modified”, dataset’ e yeni eklenen satırlar için “Added”
ve silinen satırlar için “Deleted” değerlerini alır ve DataAdapter nesnesinden
Modified satırlar için UpdateCommand, Added satırlar için InsertCommand ve
Deleted satırlar içinse DeleteCommand’ da tanımlanmış Sql komutlarını veri tabanına gönderir ve değişikliklerin orada da olmasını sağlar. İşte bütün
bu özelliklerin çalışmasını sağlayan Update metodudur.
Şimdi bu anlattıklarımızı bir örnekte pekiştirelim.
DataSet ds=new DataSet();
SqlConnection cnn=new
SqlConnection("server=local\\vsdotnet;trusted_connection=yes;database=northwind");
SqlDataAdapter da=new SqlDataAdapter("select * from
categories",cnn);
//veritabanına işlenecek bilgiler için gerekli sql komutumuzu tanımlıyoruz
da.UpdateCommand=new SqlCommand("update categories set
categoryname=@categoryname,description=@description where
categoryID=@categoryID",cnn);
//parametreler tanımlanıyor
da.UpdateCommand.Parameters.Add("@categoryname",SqlDbType.NVarChar,15,"categoryname");
da.UpdateCommand.Parameters.Add("@description",SqlDbType.NVarChar,50,"description");
da.UpdateCommand.Parameters.Add("@categoryID",SqlDbType.Int,0,"categoryID");
cnn.Open();
//Datasetimizi güncelliyoruz
DataRow crow=ds.Tables["categories"].Rows[0];
crow["categoryname"]=”kategoriadı”;
crow["description"]=”tanımlama”;
da.Update(ds,"categories");
cnn.Close();
Öncelikle veritabanı bağlantımızı kuruyoruz. Sonra
SqlDataAdapter nesnemizi tanımlıyoruz. Bu nesne sayesinde dataset nesnemize
veri aktarabilip, dataset nesnemizdeki güncellemeleri veritabanımıza geri
aktarabileceğiz. DataSet nesnemiz üzerinde veri güncelleme yapacağımız için
DataAdapter nesnemizin UpdateCommand özelliğine update sql komutunu
aktarıyoruz. Burası önemli çünkü dataset nesnemizde ne tür değişiklik
yapıyorsak(veri güncelleme, veri ekleme yada veri silme), uygun özellikleri
kullanmak zorundayız (InsertCommand, UpdateCommand, DeleteCommand). Aksi
takdirde programımızda hatalar oluşur. Bu programda UpdateCommand özelliğini
kullanıyor ve sql komutumuzda belirttiğimiz parametreleri tanımlıyoruz.
Parametre tanımlama başlı başına ayrı bir makale konusudur, bu yüzden burada
parametreleri inceleyemeyeceğiz.
DataSet nesnemizde de gerekli değişikleri yaptıktan
sonra, Update metodumuzu çalıştırıyoruz. Update metodu DataSet nesnemizdeki
değişiklikleri yukarıda bahsettiğimiz şekilde algılıyor ve DataRow
nesnelerimizdeki RowState özelliğini kontrol ederek, DataAdapter nesnemizde
tanımlanmış uygun komutları arıyor. Bu örnekde “0” indeksli satırımız
değiştikten sonra aynı satırdaki RowState özelliği “Unchanged” den “Modified” a
dönüyor ve Update metodu UpdateCommand özelliğindeki sql komutunu veritabanına
göndererek çalıştırılmasını ve datadet nesnemizdeki değişikliklerin
veritabanımızda da gerçekleşmesini sağlıyor. Eğer dataset nesnemize yeni satır
ekleseydik, Update metodu DataAdapter nesnesinde tanımlanmış InsertCommand
özelliğini arayacak ve bu özellikteki sql komutunu gönderecekti, yine tahmin
ettiğiniz gibi silinmiş satırlar için ise DeleteCommand özelliği aranacaktı.
Bu yazı işin tekniği konusunda sizi en
azından bir temel bilgi vermiştir umarım. Yakında bu konularda daha derin
bilgiler vermeyi düşünüyorum.
Hiç yorum yok:
Yorum Gönder