22 Mart 2018 Perşembe

DataTable Sınıfı

Enterprise Pattern
Transaction script, Table Model, Domain Model, Service Layer gibi Enterprise Pattern çeşitleri var. DataTable Table Model'de kullanılır.

DataTable ve DataSource
DataTable aynı zamanda bir DataSource olduğu için GUI ile kolayca birleşir.

DataTable Type Safe Değildir
Bu yüzden probleme sebep olabilir.

Nasıl Doldurulur
DataAdapter sınıflarından birisi kullanılarak doldurulur. DataTable tüm bilgiyi bellekte saklar. Çok fazla bilgi tutmasını beklemek doğru olmayabilir.
SqlConnection con = new SqlConnection(@"...");
SqlDataAdapter sda = new SqlDataAdapter("Select * From Login ", con);
DataTable dt = new DataTable();
sda.Fill(dt);
DataTable ve IList
DataTable ve IList yazısına taşıdım.

DataTable ve Linq
DataTable ve Linq yazısına taşıdım.

DataTable ve DataView
DataTable DataView kullanılarak view'a dönüştürülebilir.

Constructor
Şöyle yaparız.
DataTable dt = new DataTable();
AcceptChanges metodu
Açıklaması şöyle
When AcceptChanges is called, any rows marked Deleted are removed from the DataTable, while any rows marked Added or Modified are marked Unchanged.
Columns Alanı
DataColumnCollection tipindendir.

Compute metodu
Bir sonuç nesnesi döner.
Örnek
SQL olmak zorunda değildir. Şöyle yaparız.
var formula = "14 + 2 * 32 / 60 + 43 - 7 + 3 - 1 + 0 * 7 + 87 - 32 / 34";
var result = new DataTable().Compute(formula, null);
Console.WriteLine(result); //returns 139.125490196078
Örnek
Şöyle yaparız.
var object = dt.Compute("COUNT(Value)", "Value > 0");
Örnek
Şöyle yaparız.
// Declare an object variable.
object sumObject = table.Compute("Sum(Total)", "EmpID = 5");
Örnek
Şöyle yaparız.
// Declare an object variable.
object sumObject = table.Compute("Sum(Price)", "");
Load metodu
Parametre olarak IDataReader alır. Şöyle yaparız.
var dataReader = ccmd.ExecuteReader();
var dataTable = new DataTable();
dataTable.Load(dataReader);
Locale Alanı
DataTable nesnesine locale verilebiliyor.
dt.Locale = CultureInfo.CurrentCulture;
Şöyle yaparız.
dt.Locale = System.Globalization.CultureInfo.InvariantCulture;
Merge metodu
İki DataTable nesnesini birleştirmek için şöyle yaparız.
dt1.Merge(dt2, true, MissingSchemaAction.Add);
PrimaryKey Alanı
Şöyle yaparız.
dt.PrimaryKey = new[] { dt.Columns[0], dt.Columns[1] };
RowChanged Event'i
Şöyle yaparız.
DataTable dt = new DataTable();
dt.RowChanged += changedRow;
Satır değişince şöyle işleriz.
void changedRow(object sender, DataRowChangeEventArgs e)
{
     if(e.Action == DataRowAction.Add)
         e.Row[17] = e.Row[17].ToString().ToUpper();
}
Rows Alanı
DataRowCollection tipindendir. Açıklaması şöyle
DataTable predates generics. DataTable.Rows is declared to return DataRowCollection, which derives from InternalDataCollectionBase. That implements the non-generic ICollection interface, which means that the compiler can't infer the type of row beyond just object.
DataTable içinde her satır bir DataRow nesnesidir. Dolayısıyla şu kod derlenmez.
foreach (var row in currentTable.Rows)
{
   var valueAtCurrentRow = row[0];
}
En iyi ihtimal şöyle yaparız.
foreach (var row in currentTable.Rows.Cast<DataRow>())
{
   var valueAtCurrentRow = row[0];
}
Örnek
Satırları dolaşmak için şöyle yaparız.
DataTable dt=...
foreach (DataRow dr in dt.Rows) {...}
Örnek
Tüm satırların sayısını almak için şöyle yaparız.
int totalRows = dt.Rows.Count;
Geri kalan bilgileri DataRow Sınıfı yazısına taşıdım.

Select metodu
Açıklaması şöyle
Note that the DataTable's Select() method is not the LINQ extension method, but a method that selects an array of data rows. On that array I'm using the LINQ's Select extension method.
Şöyle yaparız.
var dt = new DataTable();
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("val1", typeof(int));
dt.Columns.Add("val2", typeof(string));

dt.Rows.Add(1, 1, "a");
dt.Rows.Add(2, 20, "b");
dt.Rows.Add(3, 300, "c");
dt.Rows.Add(4, 4000, "d");

Console.WriteLine(string.Join("\n", dt.Select().Select(row =>
 string.Format("{0}\t{1}\t{2}", row["Id"], row["val1"], row["val2"]))));
Select metodu - filter
Örnek
Şöyle yaparız.
var rows = dt.Select("col1 > 5");
foreach (var row in rows)
    row.Delete();
Select metodu - filter + order
Örnek
Şöyle yaparız.
DataTable dt = myDataset.Tables["MyTable"];
DataRow[] foundRows = dt.Select("Done > 0", "Position ASC");
Diğer
Bir Başka Tabloyu Klonlamak
1. Aynı veritabanında klonlama
Aynı sütunlarsa sahip iki tablo arasında veri kopyalaması şöyle yapılır.
foreach (DataRow dr in dataTable1.Rows) {
    if (/* some condition */)
        dataTable2.Rows.Add(dr.ItemArray);
}
Bir başka yöntem ise şöyle
dataTable2  = dataTable1.Clone();  

foreach (DataRow dr in dataTable1.Rows)
{
   if (/*put some Condition */)
   {
      dataTable2.ImportRow(dr);
   }
}
2. Bir başka veritabanına klonlama
Şöyle yapılır
string consString = "...";
using (SqlConnection con = new SqlConnection(consString))
{
  using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(con))
  {
    //Set the database table name
    sqlBulkCopy.DestinationTableName = "[Customers]";
    con.Open();
    sqlBulkCopy.WriteToServer(dt);
    con.Close();
  }
}
İki Tabloyu Birleştirme
Linq ile şöyle yapılabilir.
var result1 = from row1 in dt1.AsEnumerable()                     
select new { Name = row1.Field<String>("Name"), 
Color = row1.Field<String>("Color"), Price = "" };

var result2 = from row1 in dt2.AsEnumerable()                     
select new { Name = row1.Field<String>("Name"), 
Color = "", Price = row1.Field<String>("Price") };
var res = result1.Concat(result2);











Hiç yorum yok:

Yorum Gönder