Share via


DataSet İçeriklerini Birleştirme

bir , DataTableveya dizisinin içeriğini var olan DataSetbir DataSetile birleştirmek için yöntemini kullanabilirsiniz MergeDataRow. Yeni verilerin mevcut DataSetbir 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 DataSetsDataTables 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, DataTableveya DataRow dizisi geçirdiğinizde, var olan DataSetiç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 DataSetiç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 PreserveChangestrue, 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ğeri Deletedvarsa, bu RowState kalır Deleted ve olarak Modifiedayarlanmaz. Bu durumda, gelen satırdaki veriler var olan satırın satır sürümünde depolanmaya Original devam eder ve var olan satırın Original satır sürümünün üzerine yazılır (gelen satırda RowStateAdded.

  • Gelen satırın bir RowState değeri AddedOriginal 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 PreserveChangesfalse, 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 RowStateUnchanged değeri varsa ve var olan satırda RowStateModified, Deletedveya AddedRowState ise, var olan satırın değeri olarak Modifiedayarlanır.

  • Gelen satırda bir RowState , ve var olan satırda RowStateUnchanged, Modifiedveya DeletedRowState ise, var olan satırın değeri olarak ModifiedAddedayarlanır. Ayrıca, gelen satırın Original 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ılmaz Original .

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 MissingSchemaActionseç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 DataSetdeğ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 DataSetile 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

Ayrıca bkz.