Sözlük

5 Mayıs 2015 Salı

C# İle Generic List ve DataTable

Herhangi bir veritabanından çektiğimiz verileri işlerken ya da görüntülerken Veri Kaynağı Konfigrasyon Sihirbazı (Data Source Configuration Wizard) kullanmadan veriyi bir class ile modelleyerek ilgili data kontrolüne (GridView, Repeater vb.) kod tarafında bağlamak isteyebiliriz. Veriyi bir class ile modelleyerek kullanmak iş yükünü ve sürecini uzatır ama bize daha fazla hareket alanı ve kontrol sağlar. Teknik olarak bu bir zorunluluk değildir ancak veriyi bu şekilde işlerkenSqlDataAdapter yerine SqlDataReader kullanmamız performans anlamında özellikle veri yükümüz arttığında bir hayli performans artışı sağlar.
Class ile modellediğimiz veriyi bir Generic List ‘e atayıp GridView, ListView, ListBox, CheckBoxListvs.. gibi kontrollerden birine bağlayabiliriz. Ancak bazen Generic List’e atanmış bu veriyi DataTable‘a dönüştürme ihtiyacı duyabiliriz. Mesela şuradaki yazımda bahsettiğim örnekte olduğu gibi metodun parametre olarak bir DataTable istediği durumlarda bu dönüşümü yapacak bir class/metod işimize yarayacaktır. Şimdi basitçe bunu nasıl yapılacağını göreceğiz. Bir örnek senaryo üzerinden gidelim:
Veritabanımızda Kisiler isminde bir tablomuz var. Bu tablodan çekeceğimiz veriyi modelleyeceğimiz class’ımız:
public class KisilerDM;
{
public string Ad { get; set; }
public string Soyad { get; set; }
public string Adres { get; set; }
public string Telefon { get; set; }
public string Email { get; set; }
public KisilerDM(string Ad, string Soyad, string Adres, string Telefon, string Email)
{
this.Ad = Ad;
this.Soyad = Soyad;
this.Adres = Adres;
this.Telefon = Telefon;
this.Email = Email;
} }
Şimde de verimizi SqlDataReader ile çekerek bu class üzerinden modelleyelim:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
public class Kisiler
{
public Kisiler()
{
}
public static List KisileriGetir()
{
List kisiler = new List();
SqlConnection Conn = new SqlConnection();
Conn.ConnectionString = "";
Conn.Open();
SqlCommand Cmd = new SqlCommand("SELECT Ad, Soyad, Adres, Telefon, Email FROM Kisiler", Conn);
Cmd.CommandType = CommandType.Text;
Cmd.Parameters.Add("@Ad", SqlDbType.NVarChar);
Cmd.Parameters.Add("@Soyad", SqlDbType.NVarChar);
Cmd.Parameters.Add("@Adres", SqlDbType.NVarChar);
Cmd.Parameters.Add("@Telefon", SqlDbType.NVarChar);
Cmd.Parameters.Add("@Email", SqlDbType.NVarChar);
SqlDataReader dr = Cmd.ExecuteReader(CommandBehavior.CloseConnection);
while (dr.Read())
{
kisiler.Add(new KisilerDM(
// veri null döndüğünde hata almamak için aşağıdaki gibi
// conditional operator (?:) kullandık.
dr.IsDBNull(0) ? String.Empty : dr.GetString(0), // Ad
dr.IsDBNull(1) ? String.Empty : dr.GetString(1), // Soyad
dr.IsDBNull(2) ? String.Empty : dr.GetString(2), // Adres
dr.IsDBNull(3) ? String.Empty : dr.GetString(3), // Telefon
dr.IsDBNull(4) ? String.Empty : dr.GetString(4) // Email
));
}
dr.Close();
return kisiler;
}
}
Artık yukarıdaki metodumuz bize verilerimizden oluşan bir generic list döndürüyor. Bu generic list’i bize DataTable olarak döndürecek class ve metodlarımız:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
public class MyData
{
// bu metotla dönüştürmeyi yapılacak
public static DataTable ConvertGenericListToDataTable(IList list)
{
DataTable dt = CreateTable();
Type entityType = typeof(T);
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entityType);
foreach (T item in list)
{
DataRow dr = dt.NewRow();
foreach (PropertyDescriptor property in properties)
{
dr[property.Name] = property.GetValue(item);
}
dt.Rows.Add(dr);
}
return dt;
}

private static DataTable CreateTable()
{
Type entityType = typeof(T);
DataTable dt = new DataTable(entityType.Name);
PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(entityType);
foreach (PropertyDescriptor property in properties)
{
dt.Columns.Add(property.Name, property.PropertyType);
}
return dt;
}
}
Örnek kullanım:
List liste = KisileriGetir();
DataTable MyDataTable = MyData.ConvertGenericListToDataTable(liste);

Kaynak

Hiç yorum yok:

Yorum Gönder