DataTable'larla Çalışmak - 1
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.
#DataTable #dataset #datarow #datacolumn #fields #indexer
Neden tek yazıda bıraktın :)
İyi günler
1-databasede o verilerden varmı kontrol eden
2-varsa güncelleyen
3-güncelledikten sonrada güncellenen verileri yazdıran bir program yapmaya çalışıyorum nasıl bir yol izleyebilirim yardımcı olursanız çok sevinirim
iyi çalışmalar
DataTable oluşturup sql den cektiğim verileri table dolduruyorum fakat bu DataTable`ı return komutuyla göndermek istiyorum html de jquery ve ajax kullanarak diğer taraftan alamıyorum yardımcı olur musunuz.
[WebMethod]
public static DataTable GetTest()
{
DataTable dtable = new DataTable();
SqlConnection scon = new SqlConnection(ConfigurationManager.ConnectionStrings[`SqlConnectIDM`].ConnectionString);
SqlDataAdapter sdap = new SqlDataAdapter(`Exec machinedata`, scon);
DataSet ds = new DataSet();
sdap.Fill(dtable);
return dtable;
}
HTML de ise
test: function () {
$.ajax({
url: `development.aspx/GetTest`,
type: `POST`,
contentType: `application/json; charset=utf-8`,
data: `{`postdata`: `none`}`,
dataType: `json`,
success: function (getdata) {
$(`#cph_main_spn_devm_top`).text(getdata.d);
alert(JSON.parse(getdata.d).Table[2].MachineName);
},
error: function (hata) {
alert(`NOTOKEYTEST`);
window.location = `/mainpage.aspx`;
}
});
}
şu örneği inceler misin: http://static.daltinkurt.com/upload/2020/js_dt_test.zip
Merhaba, bu sorunla alakalı 3 öneride bulunabilirim:
1) datatable larla çalışmaktansa direkt JSON döndüren bir servis yazman daha mantıklı. js tarafında direkt alıp işleyebilirsin.
2) Datatable a bi isim verip deneyebilirsin:
DataTable dt = new DataTable(`bisiy`);
3) servisten datatable değil de dataset döndürebilirsin:
public static DataSet GetTest(){
DataTable dt=new .... ..
DataSet ds=new DataSet(`dsismi`);
ds.Tables.Add(dt);
return ds;
}
Diyelim ki benim Veritabanımda 1500 Karakterlik bilgi içerek bir kolonum var.
Ben bu kolondaki bilgiyi kullandığım gibi sadece ilk 150 karakterini başka bir yerde tanımlamak istiyorum.
Bunu nasıl yapabilirim?
dt.Rows[0][`Ozellik`].ToString();
İle hali hazırda bir bilgi var. ama bunu sınırlandırmak istiyorum.
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.
merhaba, aşağıdaki kod işinizi görecektir: