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;Şimde de verimizi SqlDataReader ile çekerek bu class üzerinden modelleyelim:
{
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;
} }
using System;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.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
public class Kisiler
{
public Kisiler()
{
}
public static ListKisileriGetir()
{
Listkisiler = 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;
}
}
using System;Örnek kullanım:
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;
}
}
Listliste = KisileriGetir();
DataTable MyDataTable = MyData.ConvertGenericListToDataTable(liste);
Kaynak
Hiç yorum yok:
Yorum Gönder