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.
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