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

C#, VB.NET, ASP.NET Add comments

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

  • Leave a Reply

    WP Theme & Icons by N.Design Studio
    Entries RSS Comments RSS Giriş