DataTable-DataSet LoadOption Enumeration [C#, VB.NET]

ADO.NET 2.0 ile gelen yeniliklerden biri olan System.Data.LoadOption numaralandırıcısı, veri kaynağından alınmış kayıtların, Load() veya Fill() metodu kullanılarak var olan ve üzerinde primary key tanımlı veri tablosuna yüklenirken aynı kayıtlara rastlanıldığında nasıl davranılacağını belirtir. Değer olarak aşağıdaki seçeneklerden birini alır.


OverwriteChanges: O satır için veri tabanından gelen değerler, kolonların hem orijinal(original) hem de o anki(current) versiyonlarına yazılır. Yani kolonlara ait DataRowVersion.Original ve DataRowVersion.Current versiyonları, veri tabanından gelen değeri gösterir.
PreserveChanges: LoadOption numaralandırıcısının default olarak değeri olan bu seçenekte o satır için veri tabanından gelen değerler, kolonların orijinal(original) versiyonlarına yazılır. O anki versiyonu değiştirilmez.
Upsert: O satır için veri tabanından gelen değerler, kolonların o anki(original) versiyonlarına yazılır. Orijinal versiyonu değiştirilmez.
Yüklenme işleminden sonra tablodaki satırların RowState durumlarının nasıl olacağı satırın yüklenme öncesi durumuna bağlıdır.

Satırın o anki RowState durumu PreserveChanges Upsert OverwriteChanges
Added Current = Existing
Original = Incoming
RowState = Modified
Current = Incoming
Original = Existing
RowState = Added
Current = Incoming
Original = Incoming
RowState = Unchanged
Modified Current = Existing
Original = Incoming
RowState = Modified
Current = Incoming
Original = Existing
RowState = Modified
Current = Incoming
Original = Incoming
RowState = Unchanged
Deleted Current = Existing
Original = Incoming
RowState = Deleted
* Undo Delete
Current = [n/a]
Original = Existing
RowState = Deleted
Undo Delete
Current = Incoming
Original = Incoming
RowState = Unchanged
Unchanged Current = Incoming
Original = Incoming
RowState = Unchanged
Current = Incoming
Original = Existing
if new value = existing
RowState = Unchanged
else
RowState = Modified
Current = Incoming
Original = Incoming
RowState = Unchanged
Tablodaki herhangi bir kayıtla eşleşmezse Current = Incoming
Original = Incoming
RowState = Unchanged
Current = Incoming
Original = [n/a]
RowState = Added
Current = Incoming
Original = Incoming
RowState = Unchanged

* Tablodan silinmiş satır için Upsert seçeneğinde gelen satır var olan satırla primary key üzerinden eşleşemeyeceği için gelen satır, tabloya yeni satır(Added) olarak eklenir.
Tablodaki “Existing” ifadesi kolonun tablodaki değerini, “Incoming” ifadesi de veri tabanından gelen değerini bildirmektedir.
SQL Server’deki Musteri tablosunda aşağıdaki kayıtlar bulunmaktadır.

Bu tabloyu, istemci tarafındaki Musteri tablosuna yükleyeceğiz. İstemci tarafındaki tabloda üç kayıt bulunmaktadır. Sonuç bölümünde tablodaki kayıtların yükleme öncesi ve sonrasında primary key kolonu, orijinal ve şu anki değerleri gösterilmiştir.

Sub Main()
    Dim oDt As New DataTable()
    oDt.Columns.Add("MusteriId", GetType(Int16))
    oDt.Columns.Add("AdSoyad")
    'Eşleşecek kayıtların güncellenebilmesi için tablo üzerinde primary key tanımlanmalıdır.
    oDt.PrimaryKey = New DataColumn() {oDt.Columns("MusteriId")}

    oDt.Rows.Add("1", "Serdar Şensoy")
    oDt.Rows.Add("2", "Ahmet Yavuz")
    oDt.Rows.Add("3", "Ayşe Özkan")

    Console.WriteLine("--- Load() Öncesi ---")

    For Each oDr As DataRow In oDt.Rows
       Console.WriteLine(oDr("MusteriId") & Chr(9) & _
         GetRowValue(oDr, "AdSoyad", DataRowVersion.Original) & Chr(9) & _
         GetRowValue(oDr, "AdSoyad", DataRowVersion.Current) & Chr(9) & _
         oDr.RowState.ToString())
    Next

    Dim oCmd As New SqlCommand("SELECT MusteriId,AdSoyad FROM Musteri", oCnn)
    oCnn.Open()

    Dim oSdr As SqlDataReader = oCmd.ExecuteReader(CommandBehavior.CloseConnection)

    oDt.Load(oSdr, LoadOption.PreserveChanges)

    Console.WriteLine(Chr(10) & "--- Load() Sonrası ---")
    For Each oDr As DataRow In oDt.Rows
       Console.WriteLine(oDr("MusteriId") & Chr(9) & _
         GetRowValue(oDr, "AdSoyad", DataRowVersion.Original) & Chr(9) & _
         GetRowValue(oDr, "AdSoyad", DataRowVersion.Current) & Chr(9) & _
         oDr.RowState.ToString())
    Next

    Console.ReadLine()
End Sub

Function GetRowValue(ByVal oDr As DataRow, _
    ByVal ColumnName As String, _
    ByVal version As DataRowVersion) As String

    'Silinmiş satırların Current değeri,
    'Eklenmiş satırların Original değeri olmadığından hata vermemesi için
    Try
        Return oDr(ColumnName, version)
    Catch
        Return "-NULL-" & Chr(9)
    End Try
End Function
static void Main(string[] args)
{
    DataTable oDt = new DataTable();
    oDt.Columns.Add("MusteriId", typeof(Int16));
    oDt.Columns.Add("AdSoyad");
    //Eşleşecek kayıtların güncellenebilmesi için tablo üzerinde primary key tanımlanmalıdır.
    oDt.PrimaryKey = new DataColumn[] { oDt.Columns["MusteriId"] };

    oDt.Rows.Add("1", "Serdar Şensoy");
    oDt.Rows.Add("2", "Ahmet Yavuz");
    oDt.Rows.Add("3", "Ayşe Özkan");

    Console.WriteLine("--- Load() Öncesi ---");
    //oDt.Rows[1].Delete();
    foreach (DataRow oDr in oDt.Rows)
        Console.WriteLine("{0}\t{1}\t{2}\t{3}",
            oDr["MusteriId"],
            GetRowValue(oDr, "AdSoyad", DataRowVersion.Original),
            GetRowValue(oDr, "AdSoyad", DataRowVersion.Current),
            oDr.RowState);

    SqlCommand oCmd = new SqlCommand("SELECT MusteriId,AdSoyad FROM Musteri", oCnn);
    oCnn.Open();

    SqlDataReader oSdr = oCmd.ExecuteReader(CommandBehavior.CloseConnection);

    oDt.Load(oSdr, LoadOption.PreserveChanges);

    Console.WriteLine("\n--- Load() Sonrası ---");
    foreach (DataRow oDr in oDt.Rows)
        Console.WriteLine("{0}\t{1}\t{2}\t{3}",
            oDr["MusteriId"],
            GetRowValue(oDr, "AdSoyad", DataRowVersion.Original),
            GetRowValue(oDr, "AdSoyad", DataRowVersion.Current),
            oDr.RowState);

    Console.ReadLine();
}//Main

static string GetRowValue(DataRow oDr,string ColumnName, DataRowVersion version) {
    //Silinmiş satırların Current değeri,
    //Eklenmiş satırların Original değeri olmadığından hata vermemesi için
    try{
        return oDr[ColumnName, version].ToString();
    }
    catch{
        return "-NULL-\t";
    }
}//GetRowValue

--- Load() Öncesi ---
1 -NULL- Serdar Şensoy Added
2 -NULL- Ahmet Yavuz Added
3 -NULL- Ayşe Özkan Added
--- Load() Sonrası ---
1 Serdar Şensoy Serdar Şensoy Modified
2 Ahmet Kaymaz Ahmet Yavuz Modified
3 -NULL- Ayşe Özkan Added
5 Ayşe Yılmaz Ayşe Yılmaz Unchanged

Diğer seçenekleri deneyelim.
oDt.Load(oSdr, LoadOption.OverwriteChanges)
--- Load() Öncesi ---
1 -NULL- Serdar Şensoy Added
2 -NULL- Ahmet Yavuz Added
3 -NULL- Ayşe Özkan Added
--- Load() Sonrası ---
1 Serdar Şensoy Serdar Şensoy Unchanged
2 Ahmet Kaymaz Ahmet Kaymaz Unchanged
3 -NULL- Ayşe Özkan Added
5 Ayşe Yılmaz Ayşe Yılmaz Unchanged

oDt.Load(oSdr, LoadOption.Upsert)
--- Load() Öncesi ---
1 -NULL- Serdar Şensoy Added
2 -NULL- Ahmet Yavuz Added
3 -NULL- Ayşe Özkan Added
--- Load() Sonrası ---
1 -NULL- Serdar Şensoy Added
2 -NULL- Ahmet Kaymaz Added
3 -NULL- Ayşe Özkan Added
5 -NULL- Ayşe Yılmaz Added

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir