31 Ağustos 2013 Cumartesi

Dataset kullanımı ile veri tabanı güncellemesi

    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:

        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: