Değerli Okurlarım, Merhabalar.
Bugünkü makalemizde bağlantısız katmanın önemli bir sınıfı olan DataTable nesnesini bir açıdan incelemeye çalışacağız. Bilindiği gibi DataTable sınıfından türetilen bir nesne, bir tabloyu ve elemanlarını bellekte temsil etmek için kullanılmaktadır. DataTable sınıfı bellekte temsil ettiği tablolara ait olan satırları Rows koleksiyonuna ait DataRow nesneleri ile temsil ederken, tabloun alanlarını ise, Columns koleksiyonuna ait DataColumn nesneleri ile temsil etmektedir.
Örnek uygulamamızda bu sınıf nesnelerini detaylı olarak kullanacağız. Diğer yandan DataTable sınıfı bir tabloya ilişkin kıstasların yer aldığı Constraints koleksiyonuna ait Constraint nesnelerinedee sahiptir. DataTable sınıfının ve üye elemanlarını aşağıdaki şekilde daha kolayca canlandırabiliriz.
Şekil 1 DataTable mimarisi
Geliştireceğimiz uygulamada, bizim belirlediğimiz alanlardan oluşan bir tabloyu bellekte oluşturmaya çalışacağız. Öncelikle DataTable nesnesi ile bir tablo oluşturmak için aşağıdaki adımları takip etmeliyiz.
- Bir DataTable nesnesi oluşturup DataTable’ın bellekte temsil edeceği tablo için bir isim belirlenir.
- Tablomuzun içereceği alanların isimleri, veri türleri belirlenerek birer DataRow nesnesi şeklinde, DataTable nesnesinin Columns koleksiyonuna eklenir.
- Tablomuz için bir primary key alanı belirlenir.
Bu adımların ardından tablomuz bellekte oluşturulmuş olucaktır. Bu noktadan sonra bu tablo üzerinde dilediğimiz işlemleri yapabiliriz. Kayıt ekleyebilir, silebilir, sorgulayabiliriz. Ama tabiki programı kapattığımızda bellekteki tablonun yerinde yeller esiyor olucaktır. Ama üzülmeyin ilerliyen makalelerimizde SQL-DMO komutları yardımıyla programımız içinden bir sql sunucusu üzerinde veritabanı oluşturacak ve tablomuzu buraya ekleyeceğiz.Şimdi dilerseniz birinci adımdan itibaren bu işlerin nasıl yapıldığını minik örnekler ile inceleyelim ve daha sonrada asıl uygulamamaızı yazalım. Öncelikle işe tablomuzu bellekte temsil edicek datatable nesnesi oluşturarak başlayalım. Aşağıdaki küçük uygulamayı oluşturalım.
Şekil 2. Formun ilk hali
Ve kodlar,
private void btnTabloOlustur_Click(object sender, System.EventArgs e)
{
/* Bir tabloyu bellekte temsil edicek bir datatable nesnesi oluşturarak işe başlıyoruz. Tablomuza txtTabloAdi isimli TextBox'a giriline değeri isim olarak veriyoruz */
DataTable dt=new DataTable(txtTabloAdi.Text);
MessageBox.Show(dt.TableName.ToString()+" TABLOSU BELLEKTE OLUŞTURULDU");
}
Şimdi programımızı çalıştıralım ve tablo ismi olarak DENEME diyelim. İşte sonuç,
Şekil 3. DataTable nesnesi oluşturuldu.
Şimdi ise tablomuza nasıl field(alan) ekleyeceğimize bakalım. Önceden bahsettiğimiz gibi tablonun alanları aslında DataTable sınıfının Columns koleksiyonuna ait birer DataColumn nesnesidir. Dolayısıyla öncelikle bir DataRow nesnesi oluşturup bu nesneyi ilgili DataTable’ın Columns koleksiyonuna eklememiz gerekmektedir. Alanın ismi dışında tabiki veri türünüde belirtmeliyiz. Bu veri türlerini belirtirken Type.GetType syntaxı kullanılır. Formumuzu biraz değiştirelim. Kullanıcı belirlediği isimde ve türdeki alanı, tabloya ekleyebilecek olsun. Söylemek isterimki bu uygulamada hiç bir kontrol mekanizması uygulanmamış ve hataların önünce geçilmeye çalışılmamıştır. Nitekim amacımız DataTable ile bir tablonun nasıl oluşturulacağına dair basit bir örnek vermektir. Formumuzu aşağıdaki gibi değiştirelim. Kullanıcı bir tablo adı girip oluşturduktan sonra istediği alanları ekleyecek ve bu bilgiler listbox nesnemizde kullanıcıya ayrıca gösterilecek.
Şekil 4. Formumuzun yeni hali.
Şimdide kodlarımızı görelim.
DataTable dt; /* DataTable nesnemizi uygulama boyunca kullanabilmek için tüm metodların dışında tanımladık. */
private void btnTabloOlustur_Click(object sender, System.EventArgs e)
{
dt=new DataTable(txtTabloAdi.Text);
MessageBox.Show(dt.TableName.ToString()+" TABLOSU BELLEKTE OLUŞTURULDU");
lblTabloAdi.Text=dt.TableName.ToString(); /* TableName özelliği DataTable nesnesinin bellekte temsil ettiği tablonun adını vermektedir.*/
}
private void btnAlanEkle_Click(object sender, System.EventArgs e)
{
/*Önce yeni alanımız için bir DataColumn nesnesi oluşturulur*/
DataColumn dc=new DataColumn();
/*Şimdi ise DataTable nesnemizin Columns koleksiyonuna oluşturulan alanımızı ekliyoruz. İlk parametre, alanın adını temsil ederken, ikinci parametre ise alanın veri türünü belirtmektedir. Add metodu bu özellikleri ile oluşturulan DataColumn nesnesini dataTable'a ekler. Bu sayede tabloda alanımız oluşturulmuş olur.*/
dt.Columns.Add(txtAlanAdi.Text,Type.GetType("System."+cmbAlanTuru.Text));
lstAlanlar.Items.Add("Alan Adı: "+dt.Columns[txtAlanAdi.Text].ColumnName.ToString()+" Veri Tipi: "+dt.Columns[txtAlanAdi.Text].DataType.ToString());
/* ColumnName özelliği ile eklenen alanın adını, DataType özelliği ilede bu alanın veri türünü öğreniyoruz.*/
}
Uygulamamızı deneyelim.
Şekil 5. Alanlarımızıda tabloya ekleyelim.
Alanlara veri türlerini aktarırken kullanabileceğimiz diğer örnek değerler aşağıdaki gibidir; bunlar listbox kontrolüne desing time(tasarım zamanında) eklenmiştir.
System.Int32
System.Int16
System.Int64
System.Byte
System.Char
System.Single
System.Decimal
System.Double
Gibi...
Şimdi de seçtiğimiz bir alanı primary key olarak belirleyelim. Unique (benzersiz) integer değerler alıcak bir alan olsun bu ve 1000 den başlayarak 1’er 1’er otomatik olarak artsın. Bildiğini ID alanlarından bahsediyorum. Bunu kullanıcıya sormadan otomatik olarak biz yaratalım ve konudan fazlaca uzaklaşmayalım. Sadece btnTabloOlustur’un kodlarına ekleme yapıyoruz.
private void btnTabloOlustur_Click(object sender, System.EventArgs e)
{
dt=new DataTable(txtTabloAdi.Text);
MessageBox.Show(dt.TableName.ToString()+" TABLOSU BELLEKTE OLUŞTURULDU");
lblTabloAdi.Text=dt.TableName.ToString(); /* TableName özelliği DataTable nesnesinin bellekte temsil ettiği tablonun adını vermektedir.*/
/* Tablo oluşturulduğunda otomatik olarak bir ID alanı ekleyelim. Bu alan benzersiz bir alan olucak yani içerdiği veriler tekrar etmiyecek. 1 den başlayarak birer birer otomatik olarak artıcak. Aynı zamanda primary key olucak. Primary key olduğu zaman arama gibi işlemleri yaparken bu alanı kullanacağız.*/
DataColumn dcID=new
DataColumn(); /* DataColumn nesnesi oluşturulur.*/
dcID.ColumnName="ID"; /* Alanın adı veriliyor*./
cID.DataType=Type.GetType("System.Int32"); /* Alanın veritipi belirleniyor*/
dcID.Unique=true;/* Alanın içerdiği verilerin tekrar etmeyeceği söyleniyor.*/
dcID.AutoIncrement=true;/* Alanın değerlerinin otomatik olarak artacağı söyleniyor.*/
dcID.AutoIncrementSeed=1;/* İlk değeri 1 olucak.*/
dcID.AutoIncrementStep=1;/* Alanın değerleri 1'er artıcak.*/
dt.Columns.Add(dcID);/* Yukarıda özellikleri belirtilen ID alanı tablomuza ekleniyor. */
/* Aşağıdaki kod satırları ile ID isimli alanı Primary Key olarak belirliyoruz. */
DataColumn[] anahtarlar=new DataColumn[1];
anahtarlar[0]=dt.Columns["ID"];
dt.PrimaryKey=anahtarlar;
lstAlanlar.Items.Add(dt.Columns["ID"].ColumnName.ToString()+" Primary Key");
}
Geldik bir makalemizin daha sonuna. Bir sonraki makalemizde oluşturduğumuz bu tabloya nasıl veri ekleneceğini göreceğimiz çok kısa bir uygulama yazacağız. Hepinizi mutlu günler dilerim.