DataSet İçeriklerini Birleştirme
bir , DataTableveya dizisinin içeriğini var olan DataSet
bir DataSetile birleştirmek için yöntemini kullanabilirsiniz Merge DataRow. Yeni verilerin mevcut DataSet
bir ile birleştirilmesini etkileyen çeşitli faktörler ve seçenekler vardır.
Birincil Anahtarlar
Birleştirmeden yeni veri ve şema alan tablonun birincil anahtarı varsa, gelen verilerden yeni satırlar, gelen verilerdekilerle aynı Original birincil anahtar değerlerine sahip mevcut satırlarla eşleştirilir. Gelen şemadaki sütunlar mevcut şemanın sütunlarıyla eşleşiyorsa, var olan satırlardaki veriler değiştirilir. Mevcut şemayla eşleşmeyen sütunlar yoksayılır veya parametresine göre MissingSchemaAction eklenir. Varolan satırlarla eşleşmeyen birincil anahtar değerlerine sahip yeni satırlar var olan tabloya eklenir.
Gelen veya var olan satırların Addedsatır durumu ise, satır sürümü olmadığından Original
birincil anahtar değerleri satırın Added
birincil anahtar değeri kullanılarak Current eşleştirilir.
Gelen tablo ve var olan bir tablo aynı ada ancak farklı veri türlerine sahip bir sütun içeriyorsa, bir özel durum oluşturulur ve MergeFailed olayı DataSet
oluşturulur. Hem gelen tablo hem de mevcut bir tabloda tanımlı anahtarlar varsa, ancak birincil anahtarlar farklı sütunlara yönelikse, bir özel durum oluşturulur ve MergeFailed
olayı DataSet
oluşturulur.
Birleştirmeden yeni veri alan tablonun birincil anahtarı yoksa, gelen verilerden yeni satırlar tablodaki mevcut satırlarla eşleştirilemez ve bunun yerine var olan tabloya eklenir.
Tablo Adları ve Ad Alanları
DataTable nesnelere isteğe bağlı olarak bir Namespace özellik değeri atanabilir. Değerler atandığındaNamespace, aynı DataSet değere TableName sahip birden çok DataTable nesne içerebilir. Birleştirme işlemleri sırasında, hem hem Namespace de TableName birleştirmenin hedefini tanımlamak için kullanılır. Atanmamışsa Namespace , birleştirmenin hedefini tanımlamak için yalnızca TableName öğesini kullanılır.
Not
Bu davranış .NET Framework'ün 2.0 sürümünde değişti. Sürüm 1.1'de ad alanları destekleniyordu ancak birleştirme işlemleri sırasında yoksayıldı. Bu nedenle, özellik değerlerini kullanan Namespace bir DataSet ,NET Framework'ün hangi sürümünü çalıştırdığınıza bağlı olarak farklı davranışlara sahip olur. Örneğin, aynı TableName özellik değerlerine ancak farklı Namespace özellik değerlerine sahip iki DataSets
DataTables
tane olduğunu varsayalım. .NET Framework'ün 1.1 sürümünde, iki DataSet nesne birleştirildiğinde farklı Namespace adlar yoksayılır. Ancak, sürüm 2.0'dan başlayarak birleştirme, hedefte DataSetiki yeni DataTables
oluşturulmasına neden olur. Özgün DataTables
birleştirmeden etkilenmez.
Preservechanges
yöntemine bir DataSet
, DataTable
veya DataRow
dizisi geçirdiğinizde, var olan DataSet
içindeki değişikliklerin korunup korunmayacağını ve gelen verilerde bulunan yeni şema öğelerinin nasıl işleneceğini belirten Merge
isteğe bağlı parametreler ekleyebilirsiniz. Gelen verilerden sonraki bu parametrelerden ilki, PreserveChangesmevcut DataSet
içindeki değişikliklerin korunup korunmayacağını belirten bir Boole bayrağıdır. PreserveChanges
bayrağı olarak ayarlanırsatrue
, gelen değerler var olan satırın Current
satır sürümündeki mevcut değerlerin üzerine yazılmaz. PreserveChanges
bayrağı olarak ayarlanırsafalse
, gelen değerler var olan satırın satır sürümündeki mevcut değerlerin Current
üzerine yazar. PreserveChanges
Bayrak belirtilmezse, varsayılan olarak olarak ayarlanırfalse
. Satır sürümleri hakkında daha fazla bilgi için bkz . Satır Durumları ve Satır Sürümleri.
olduğunda PreserveChanges
true
, var olan satırdaki veriler var olan satırın Current satır sürümünde tutulurken, var olan satırın satır sürümündeki verilerin Original üzerine gelen satırın satır sürümündeki veriler Original
yazılır. RowState Varolan satırın değeri olarak Modifiedayarlanır. Aşağıdaki özel durumlar geçerlidir:
Varolan satırın bir
RowState
değeriDeleted
varsa, buRowState
kalırDeleted
ve olarakModified
ayarlanmaz. Bu durumda, gelen satırdaki veriler var olan satırın satır sürümünde depolanmayaOriginal
devam eder ve var olan satırınOriginal
satır sürümünün üzerine yazılır (gelen satırdaRowState
Added
.Gelen satırın bir
RowState
değeriAdded
Original
varsa, gelen satırın satır sürümü olmadığından, var olan satırın satır sürümündeki verilerin üzerine gelen satırdaki veriler yazılmazOriginal
.
olduğunda PreserveChanges
false
, var olan satırdaki Current
hem hem Original
de satır sürümlerinin üzerine gelen satırdaki veriler yazılır ve RowState
var olan satırın sürümü gelen satırın değerine ayarlanır RowState
. Aşağıdaki özel durumlar geçerlidir:
Gelen satırın bir
RowState
Unchanged
değeri varsa ve var olan satırdaRowState
Modified
,Deleted
veyaAdded
RowState
ise, var olan satırın değeri olarakModified
ayarlanır.Gelen satırda bir
RowState
, ve var olan satırdaRowState
Unchanged
,Modified
veyaDeleted
RowState
ise, var olan satırın değeri olarakModified
Added
ayarlanır. Ayrıca, gelen satırınOriginal
satır sürümü olmadığından, var olan satırın satır sürümündeki verilerin üzerine gelen satırdaki veriler yazılmazOriginal
.
Missingschemaaction
Yönteminin isteğe bağlı MissingSchemaAction parametresini kullanarak, var olan DataSet
öğesinin Merge
parçası olmayan gelen verilerdeki şema öğelerinin nasıl Merge
işleneceğini belirtebilirsiniz.
Aşağıdaki tabloda için MissingSchemaAction
seçenekleri açıklanmaktadır.
MissingSchemaAction seçeneği | Açıklama |
---|---|
Add | 'a DataSet yeni şema bilgilerini ekleyin ve yeni sütunları gelen değerlerle doldurun. Bu varsayılan seçenektir. |
AddWithKey | 'a DataSet yeni şema ve birincil anahtar bilgilerini ekleyin ve yeni sütunları gelen değerlerle doldurun. |
Error | Eşleşmeyen şema bilgileriyle karşılaşılırsa özel durum oluşturma. |
Ignore | Yeni şema bilgilerini yoksayın. |
Sınırlamalar
yöntemiyle Merge
, tüm yeni veriler var olan DataSet
öğesine eklenene kadar kısıtlamalar denetlenmiyor. Veriler eklendikten sonra, içindeki geçerli değerler DataSet
üzerinde kısıtlamalar uygulanır. Kodunuzun kısıtlama ihlalleri nedeniyle oluşturulabilecek özel durumları işlediğine emin olmanız gerekir.
bir içindeki DataSet
mevcut satırın birincil anahtar değeri 1 olan bir Unchanged
satır olduğu bir durumu düşünün. Birincil anahtar değeri 2 ve birincil anahtar değeri 1 olan bir gelen satırı olan Original
birleştirme Current
işlemi Modified
sırasında, birincil anahtar değerleri farklı olduğundan Original
var olan satır ve gelen satır eşleşme olarak kabul edilmez. Ancak birleştirme tamamlandığında ve kısıtlamalar denetlendiğinde, birincil anahtar değerleri birincil anahtar sütunu için benzersiz kısıtlamayı ihlal ettiğinden Current
bir özel durum oluşturulur.
Not
Kimlik sütunu gibi otomatik artan bir sütun içeren bir veritabanı tablosuna satırlar eklendiğinde, ekleme tarafından döndürülen kimlik sütunu değeri içindeki DataSet
değerle eşleşmeyebilir ve döndürülen satırların birleştirilmesi yerine eklenmesine neden olabilir. Daha fazla bilgi için bkz . Kimlik veya Otomatik Sayı Değerlerini Alma.
Aşağıdaki kod örneği, farklı şemalara sahip iki nesneyi, gelen DataSet
iki DataSet
nesnenin birleştirilmiş şemalarıyla birleştirirDataSet
.
using (SqlConnection connection =
new(connectionString))
{
SqlDataAdapter adapter =
new(
"SELECT CustomerID, CompanyName FROM dbo.Customers",
connection);
connection.Open();
DataSet customers = new();
adapter.FillSchema(customers, SchemaType.Source, "Customers");
adapter.Fill(customers, "Customers");
DataSet orders = new();
orders.ReadXml("Orders.xml", XmlReadMode.ReadSchema);
orders.AcceptChanges();
customers.Merge(orders, true, MissingSchemaAction.AddWithKey);
}
Using connection As SqlConnection = New SqlConnection(
connectionString)
Dim adapter As New SqlDataAdapter(
"SELECT CustomerID, CompanyName FROM Customers", connection)
connection.Open()
Dim customers As New DataSet()
adapter.FillSchema(customers, SchemaType.Source, "Customers")
adapter.Fill(customers, "Customers")
Dim orders As New DataSet()
orders.ReadXml("Orders.xml", XmlReadMode.ReadSchema)
orders.AcceptChanges()
customers.Merge(orders, True, MissingSchemaAction.AddWithKey)
End Using
Aşağıdaki kod örneği, mevcut güncelleştirmeleri DataSet
alır ve bu güncelleştirmeleri veri kaynağında işlenecek bir'e DataAdapter
geçirir. Sonuçlar daha sonra özgün DataSet
ile birleştirilir. Hatayla sonuçlanan değişiklikler reddedildikten sonra, birleştirilen değişiklikler ile işlenir AcceptChanges
.
DataTable customers = dataSet.Tables["Customers"]!;
// Make modifications to the Customers table.
// Get changes to the DataSet.
DataSet dataSetChanges = dataSet.GetChanges() ?? new();
// Add an event handler to handle the errors during Update.
adapter.RowUpdated += OnRowUpdated;
connection.Open();
adapter.Update(dataSetChanges, "Customers");
connection.Close();
// Merge the updates.
dataSet.Merge(dataSetChanges, true, MissingSchemaAction.Add);
// Reject changes on rows with errors and clear the error.
DataRow[] errRows = dataSet.Tables["Customers"]!.GetErrors();
foreach (DataRow errRow in errRows)
{
errRow.RejectChanges();
errRow.RowError = null;
}
// Commit the changes.
dataSet.AcceptChanges();
Dim customers As DataTable = dataSet.Tables("Customers")
' Make modifications to the Customers table.
' Get changes to the DataSet.
Dim dataSetChanges As DataSet = dataSet.GetChanges()
' Add an event handler to handle the errors during Update.
AddHandler adapter.RowUpdated, New SqlRowUpdatedEventHandler(
AddressOf OnRowUpdated)
connection.Open()
adapter.Update(dataSetChanges, "Customers")
connection.Close()
' Merge the updates.
dataSet.Merge(dataSetChanges, True, MissingSchemaAction.Add)
' Reject changes on rows with errors and clear the error.
Dim errRows() As DataRow = dataSet.Tables("Customers").GetErrors()
Dim errRow As DataRow
For Each errRow In errRows
errRow.RejectChanges()
errRow.RowError = Nothing
Next
' Commit the changes.
dataSet.AcceptChanges()
protected static void OnRowUpdated(
object sender, SqlRowUpdatedEventArgs args)
{
if (args.Status == UpdateStatus.ErrorsOccurred)
{
args.Row.RowError = args.Errors!.Message;
args.Status = UpdateStatus.SkipCurrentRow;
}
}
Private Sub OnRowUpdated(
ByVal sender As Object, ByVal args As SqlRowUpdatedEventArgs)
If args.Status = UpdateStatus.ErrorsOccurred Then
args.Row.RowError = args.Errors.Message
args.Status = UpdateStatus.SkipCurrentRow
End If
End Sub