19 Şubat 2017 Pazar
Twitter

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.

Değerlendirme

Yazım dilinin sadeliği ve anlaşılabilirliği Puan: 4,18 (9 oy)
Yazıdaki kodların kalitesi Puan: 3,63 (8 oy)
İhtiyaca cevap verme Puan: 3,80 (4 oy)
Tavsiye edilebilirlik Puan: 3,76 (5 oy)
Genel değerlendirme Puan: 3,49 (5 oy)
Puanlamalar 5 üzerindendir.
  • Site Yorumları
  • Facebook Yorumları Facebook Yorumları
Yeni yorum yaz Toplam: 5, Onay bekleyen: 0.
  1. akif bal

    Merhaba DataTable kullanımı gayet pratik aslında fakat datatable ile oluşturduğum tabloyu byte[] olarak nasıl aktarabilirim? Aslında FileContentResult ile pdf döküyorum fakat DataTable`ı alamıyorum bir türlü. İlginiz için şimdiden teşekkür ederim.

    • Devrim Altınkurt

      merhaba, aşağıdaki kod işinizi görecektir:




      private byte[] ConvertDataSetToByteArray(DataTable dataTable)
      {
      byte[] binaryDataResult = null;
      using (MemoryStream memStream = new MemoryStream())
      {
      BinaryFormatter brFormatter = new BinaryFormatter();
      dataSet.RemotingFormat = SerializationFormat.Binary;
      brFormatter.Serialize(memStream, dataTable);
      binaryDataResult = memStream.ToArray();
      }
      return binaryDataResult;
      }

      • akif bal

        Çok hızlı cevap verdiğiniz için ayrıca teşekkür ediyorum. Dediğiniz şekilde yaptım. Fakat çıkan excel dosyasında c# kodları çıktığı gibi dataSet.RemotingFormat = SerializationFormat.Binary; kısmında dataSet için hata veriyor. Onu dataTable yaparak çalıştırabildim sadece.
        Aslında ben pdf için itextsharp kullanmıştım ve işleyiş olarak ona benzer bir kullanım aradım.

  2. Adnan Yurdakul

    Sayın Devrim ALtınkurt Yazılarınızı beğeni ile takip ediyorum Ayrıntılı örnekli ve anlaşılabilir şekilde yazmışsınız Başarılarınızın devamını devamı dilerim Saygılarımla Çok teşekkürler

    • Devrim Altınkurt

      bu güzel düşünceleriniz için esas ben teşekkür ederim