DataTable'larla Çalışmak - 1

DataTable hakkında hazırladığım yazı dizisi 1. bölümü

DataTable nesnesini özellikle EF (Entity Framework) çıkmadan önce ADO.NET'te oldukça sık kullanırdık. Son zamanlarda yine bazı nedenlerden dolayı DataTable kullanmaya başladım projelerinde.

Ben de bu noktadan hareketle DataTable'larla ilgili bir yazı dizisi oluşturmaya karar verdim. Bu okuduğunuz bu serinin 1. yazısı.

DataTable, hep bir excel sayfasına benzetilir. Yanlış değil. Satırlardan ve sütunlardan oluşur. Satırlar datayı, sütunlar da veri alanlarını temsil eder.

DataTable ile çalışıyorsak;

Satırlar -> DataRow,

Sütunlar -> DataColumn

olarak isimlendirilir.

DataTable ne işe yarar?

1. Veritabanından select sorgusu ile çektiğimiz verileri DataTable'da tutabiliriz

Belki buraya göz atmak isteyebilirsiniz.

2. Veriyi çektikten sonra veritabanı ile bir bağlantımız kalmadığından istediğimiz değişikliği yapabiliriz. (Disconnect yapısı)

3. DataTable, sistem hafızasında tutulduğu için hızlıdır.

4. Windows form'da, ASP.NET'te, Console'da... nerede isterseniz kullanabilirsiniz.

5.Xml alt yapısını kullanır, dolayısıyla WebService leri için birebirdir. 

6. Veri işleme son derece kolaydır.

7. Üzerinde LINQ sorgusu çalıştırabiliriz.

8. LIST'e, XML'e, Excel tablosuna ve daha pekçok formata çevirmek son derece kolaydır.


Şimdi ilk iş olarak programımızda DataTable nesnesini nasıl üretiriz, içerisine veriler nasıl ekleriz, bunun üzerinde duralım.

DataTable, System.Data namespace'i altındadır. Dolayısıyla programımızda öncelikle şu satırı eklememiz gerekir:

using System.Data;

Şimdi bir adet DataTable nesnesi üretelim ve içerisine bazı bilgi alanları oluşturalım:

DataTable dt = new DataTable();
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("AdSoyad", typeof(string));
dt.Columns.Add("Yas", typeof(int));

dt.Columns["Id"].AutoIncrement = true; // Otomatik artan olsun
dt.Columns["Id"].AutoIncrementSeed = 1; // Kaçtan başlasın
dt.Columns["Id"].AutoIncrementStep = 1; // Kaçar kaçar artsın
dt.PrimaryKey = new DataColumn[] { dt.Columns["Id"] }; // PK tanımlayalım.

Gördüğünüz üzere veritabanı tablolarında kullandığımız mantığı buraya bire bir uyarlayabiliyoruz. Alan eklerken, adını ve tipini belirtiyoruz.

İstersek PrimaryKey imizi tanımlayabiliyoruz. (İleride satır silme vb. işlemler için PK alanını kullanacağız. Dolayısıyla kullansak da kullanmasak da bir adet PK ekleyelim.)

dt.PrimaryKey = "Id";

neden yazmadık diye sorabilirsiniz. Veritabanı tablolarımızda da olduğu gibi birden fazla alanı birlikte PK olarak (Composite key) tanımlayabiliriz. O yüzden tek bir sütun ile değil, sütun dizisi ile PK tanımlıyoruz.

Şİmdi de DataTable'ımıza bir satır ekleyelim:

DataRow dr = dt.NewRow();
dr["AdSoyad"] = "Devrim Altınkurt";
dr["Yas"] = 34;
dt.Rows.Add(dr);

dt.NewRow() ile beraber DataTable nesnesini oluştururken kullandığımız alanları DataRow'a aktarıyoruz.

Teker teker değerleri veriyoruz. Son olarak DataTable'in Rows kolleksiyonuna satırı ekliyoruz.

Tabii burada dr.AdSoyad veya dr.Yas tarzında bir kullanım istiyor insan, ancak burada maalesef indexleyicileri kullanmak durumundayız.

Rows özelliği bir kolleksiyon (DataRowCollection) olduğu için, aslında kayıt eklemek satır eklemek, kayıt silmek satır silmek, vb. demek olduğunu herhalde farketmişsinizdir.

DataTable oluşturmak ve DataTable'a kayıt eklemek işte bu kadar kolay.

Şimdi de eklediğimiz kaydı okuyalım:

var adsoyad = dt.Rows[0]["AdSoyad"].ToString();
var yas = dt.Rows[0]["Yas"].ToInt32();

.ToInt32() genişletme metodu için bkz: Kullandığım genişletme metotlarım

Veri okumak için daha güzel yöntem aslında şudur:

var adsoyad = dt.Rows[0].Field<string>("AdSoyad");
var yas = dt.Rows[0].Field<int>("Yas");

.Fields<T>() generic metodu ile alanın tipini ve adını vererek daha güzel bir okuma yapmış oluyoruz.

Yazının en başında, DataRow'lar ve DataColumn'lardan bahsetmiştim. İşte burada bu iki boyutlu yapıyı görebiliyoruz.

dt.Rows[0]["AdSoyad"] şeklinde kullanım mümkündür. (dt.Rows[Satır][Sütun] mantığı)

Indexer lar sağolsun ister index numarasını vererek istersek isim vererek Rows dizisini okumak mümkün. :)

Sonraki yazılarımızda, ise diğer DataTable işlemlerinden bahsetmeye çalışacağım.

Şimdilik herkese kolay gelsin.