Dataset nesneleri aslında ADO(ActiveX Data Objects) ile gelen recordset kavramına çok benzemekte ve bunlara paralellik göstermektedir. Ancak recordset kavramı tam olarak ADO.Net ile gelen Dataset nesnelerini karşılamamaktadır. Dataset objeleri bu recordsetlerin bayağı genişletilmiş bir versiyonu olarak karşımıza çıkmaktadır. Datasetler genel olarak veritabanı ile bağlantısı kesilmiş verileri tutmakta kullanılır. Daha önceki yazılarımızdan kalma geleneği devam ettirerek adım adım anlatacağım. Anlatacağım adımlar :
I. DataSet nesnesi yaratılması
II. Kayıt Ekleme
III. “Dirty” Data Yakalama
IV. Değişiklikleri Kabul Etme
V. Veri Bileşenlerini Bağlama
VI. Veri Saklama(Persisting Data)
I. DataSet Nesnesi YaratmaDataSet nesnesinin bir örneği yaratılacağı zaman DataSet constructor’ı kullanılır. Yeni bir DataSet nesnesi yaratırken isterseniz parametresiz çağırarak taban constructor’ını kullanabilirsiniz veya kendiniz bu metodu overload edebilirsiniz bu durumda ise constructor’e DataSet nesnesinin adını parametre olarak gönderirsiniz. Aşağıda bu iki durumun kullanmı gösterilmiştir.
DataSet dataSet = new DataSet(); è Taban constructor’ı kullanılmış
DataSet dataSet = new DataSet("ornekDataSet"); è overload edilmiş
DataSet nesnesinin içini doldurnayı .Net data providerları bir arabirim işlevi görerek yapar. DataSet nesnesi veriyi tutar, veri üzerinde update(güncelleme), delete(silme), add(ekleme) işlevlerinin yapılmasına da izin verir. Ancak bu DataSet nesnesinin o sırada veritabanı ile bağlantısı olmadığı için Update metodu çağrıldığı zaman veri üzerinde yapılan değişiklikler DataAdapter nesnesi aracılığı ile veritabanına gönderilirler.
DataSet nesnesinin içerisindeki veriler tablolar halinde organize olmuştur. Bu tablolar DataTable nesnesi tarafından üretilir. Bu tabloları kullanırken DataSet nesnesi birbirileri ile alakalı yada alakasız bir çok veri kümesi tutar. Her DataTable nesnesi ise içerdiği DataRow ve DataColumn nesneleri ile verileri tutar.
DataSet’i verilerle doldurduktan sonra istediğiniz veriyi döndürmek için verileri parse etmek gerekir. Bu ise dataset içerisinde satır ve sütunlar arasında bir döngü kurularak yapılabilir. Bunun için basit bir döngü kodu aşağıda belirtilmiştir.
foreach(DataRow row in dataSet.Tables[0].Rows)
{
foreach(DataColumn col in row.Table.Columns)
this.textBox1.Text = this.textBox1.Text + row[col].ToString() + "\t";
this.textBox1.Text = this.textBox1.Text + "\n";
}
Eğer veriyi parse ederken veri üzerinde bir değişiklik yapmak isteyebilirsiniz bu durumda datasetin DataRow(satır) ve DataColomn’ına(sütun) erişmeniz gerekir. Bunun için ise basit bir kod aşağıda belirtilmiştir.
foreach(DataRow row in dataSet.Tables[0].Rows)
row[1] = "YeniDeger";
II. Kayıt EklemeYeni bir DataRow nesnesi yaratarak DataSet’e yeni kayıt eklemesi yapılır. Bu ise DataTable nesnesinin NewRow metodu kullanılarak gerçekleştirilir. Bu metod ile boş bir row(sıra) yaratılır. Kayıt ekleme için basit bir örnek kod aşağıda belirtilmiştir.
DataRow row = dataSet.Tables[0].NewRow();
row["tanitici_no"] = "11-03-1981";
row["soyad"] = "soyad";
row["ilkad"] = "ilkad";
dataSet.Tables[0].Rows.Add(row);
III. “Dirty” Data YakalamaTürkçeye direkt olarak çevirdiğimiz zaman kirli veri gibi bir anlama geldiği için bu terimin ingilizcesini kullanacağım. Bazen veriler üzerinde değişiklik yaparız ancak bu değişklikler henüz DataSet tarafından kabul edilmemiştir. İşte bu gibi durumlarda bu tip verilere verilen isim Dirty Data’dır. Şimdi ise bu Dirty Data’nın yakalanma işlemine sıra geldi. Bu tip verileri yakalamak için DataSet içerisinde HasChanges() metodu mevcuttur. Bu metod sonunda eğer true dönerse DataSet’in üzerinde değişiklik yapılan(ancak bu değişiklikler henüz DataSet tarafından kabul edilmemiştir.) verilere sahip olduğu anlamına gelir. Dirty Data yakalamaya örnek basit bir metodun kod parçası aşağıda gösterilmiştir.
private void DirtyDataYakala (DataSet dataSet)
{
if(dataSet.HasChanges())//Eğer değişklik yapıldıysa buraya girer
{
//Sadece değişiklikleri getir
DataSet dirtyDataSet = dataSet.GetChanges();
}
}
IV. Değişiklikleri Kabul EtmeDataSet üzerinde herhangi bir veri üzerinde değişklik yapıldığı zaman veride değişiklik yapıldığına dair işaretlenir. Eğer veri üzerinde yapılan değişkliğin doğruluğu onaylanırsa veri üzerinde yapılan değişiklikler kabul edilmek üzere DataSet nesnesinin AcceptChanges() metodu çağrılır. Ayrıca tüm DataSet’ler üzerinde yapılan değişiklikleri kabul etmek istemiyorsanız DataRow yada DataTable’ın AcceptChanges() metodunu kullanabilirsiniz. Bu sayede veriler üzerinde tam bir yönetim söz konusu olabilir.
Yalnız DataSet üzerinde yaptığınız değişiklikler veritabanını değiştirmez.(Eğer DataSet’inizin veritabanı bağlantısı kesilmişse ki performans açısından bağlantının kesilmiş olması daha yararlıdır.). Bu yüzden DataAdapter nesnesinin Update() metodunu kullanarak veritabanına sadece değişiklik yapılan kısımların gönderilmesi sağlanır. (Dikkat tüm veriler gitmiyor sadece değişiklikler gidiyor.)
V. Veri Bileşenlerini BağlamakYeni .Net bileşenleri(component) sayesinde verileri bağlamak hem Windows Formlarında hem de Web Formlarında oldukça basitleşti. DataSetleri Windows veya Web Formlarına bağlayarak DataSetin içindeki bütün verileri görmek mümkün.
Bu bileşenlerden bir tanesi olan DataGrid’ler çoklu DataTable nesnesini içlerinde barındırırlar. Bu DataTable’lerin her biri de çoklu data row nesneleri içerirler. DataGrid’in DataSource özelliğine sadece DataSet nesnesini bağlamamız DataSet’lere erişmemiz için yeterli olur. Tabii bir de DataSet içerisinden hangi DataTable nesnesinin gösterileceğini belirtmemiz gerekir. Aksi halde DataGrid üzerinde DataSet’in sahip olduğu bütün DataRow’lar gösterilir. Bu işlemi ise DataGrid’in DataMember özelliğini kullanarak yapabiliriz. Şimdi bu işlemleri gösteren basit bir kod parçasına bakalım.
//Yalnız bu işlemi yaparken
//DataGrid'in daha önceden tanımlanmış olması gerekir
ornekDataGrid.DataSource = dataSet;
ornekDataGrid.DataMember = "Insan";
DataGrid nesnesini Toolbox içerisinden formunuza sürükleyip bırakarak yaratabilirsiniz. Yada eğer Windows Application yapıyorsanız System.Windows.Forms.DataGrid isim uzayı altından manuel olarak da yaratabilirsiniz. Eğer Web Appplication yazıyorsanız System.Web.UI.WebControls.DataGrid isim uzayı altından yaratabilirsiniz.
Diğer kontollerde örneğin metin kutularında(TextBox)’larda ise Windows Application’da System.Windows.Forms.Controls.Binding sınıfını kullanarak DataSet’leri bağlayabilirsiniz. Eğer Web Application yazıyorsanız bu sefer System.Web.UI.DataBinding sınıfını kullanabilirsiniz. Şimdi bunlara ilişkin küçük bir kod parçasına bakalım.
Windows Application için ;
textBox1.DataBindings.Add(new System.Windows.Forms.Binding("Text", dataSet, "tanitici_no"));
Web Application için ;
Burada biraz daha değişik Web Application’larda Run Time(çalışma) sırasında veriler bağlanır bu yüzden bu kontrollere veri bağlayacağınız zaman bu işlemi seçtiğiniz kontrolün(TextBox, Label vs…Wink Properties(özellik) penceresinden DataBaindings özelliğini tıklayıp custom binding expression radio button’unun seçip ordaki alanın içine new System.Web.UI.DataBinding("Text", dataSet, "tanitici_no") şeklinde bağlamak istediğiniz verinin expression’ını yazmanız yeterli olacaktır.
Şimdi parantez içinde yazannların neler olduğuna bakalım:
“Text” : Bu kontrolün hangi özelliğine veri bağlayacağımızı belirtir. “Text” diye belirterek metin kutusuna Text özelliğine veri bağlayacağımızı belirtiyoruz. (Property name)
dataSet : Veri kaynağı nesnesini belirtiyoruz. (data source)
“tanitici_ no” : Bu ise bağlanan verinin hangi üyesinin bağlandığını belirtir. (data member)
VI. Veri Saklama(Persisting Data)DataSetler üzerinde çalışırken, DataSet’teki verileri bilgisayarınızdaki XML dosyalarına kaydedebilirsiniz. Örneğin seyahate çıktınız. Ancak şirket bilgisayarındaki veritabanı bilgilerine ihtiyacınız var. Bu veritabanını öncelikle DataSet’e bağlayıp bütün verileri XML dosyasına kaydettiğiniz zaman seyahatte iken bu XML dosyasını kullanarak bütün verilere ulaşabilirsiniz. Ve bu dosyadaki verileri kullanarak işinizi yapabilirsiniz daha sonra bu dosya üzerinde yaptığınız değişiklikleri seyahat dönüşü şirket bilgisayarınıza aktarabilirsiniz. Aşağıda bu işlemle ilgili örnek bir kod parçası belirtilmiştir.
DataSet üzerindeki veriyi XML dosyasına kaydetme :
dataSet.WriteXml(“C:\\Veri.xml”Wink;
XML dosyasındaki verileri DataSet’e aktarma :
dataSet.ReadXml(“C:\\Veri.xml”Wink;
Evet teorik olaraka DataSet nesneleri ile anlatacaklarım bu kadar. Ancak yukarıda anlattıklarım ile ilgili olarak basit bir Windows C#.Net uygulamasını da buraya koyuyorum. Programı indirmek için DataSets tıklayın. Uygulama yine SQL Server ile birlikte gelen Northwind veritabanını ve bununla birlikte gelen Ten Most Products adlı Stored Procedure’ı kullanmakta.