Delen via


Gegevensset-inhoud samenvoegen

U kunt de Merge methode gebruiken om de inhoud van een DataSet, DataTableof DataRow matrix samen te voegen in een bestaande DataSet. Verschillende factoren en opties zijn van invloed op de wijze waarop nieuwe gegevens worden samengevoegd in een bestaande DataSet.

Primaire sleutels

Als de tabel die nieuwe gegevens en schema's van een samenvoeging ontvangt, een primaire sleutel heeft, worden nieuwe rijen van de binnenkomende gegevens vergeleken met bestaande rijen met dezelfde Original primaire-sleutelwaarden als die in de binnenkomende gegevens. Als de kolommen uit het binnenkomende schema overeenkomen met die van het bestaande schema, worden de gegevens in de bestaande rijen gewijzigd. Kolommen die niet overeenkomen met het bestaande schema, worden genegeerd of toegevoegd op basis van de MissingSchemaAction parameter. Nieuwe rijen met primaire-sleutelwaarden die niet overeenkomen met bestaande rijen, worden toegevoegd aan de bestaande tabel.

Als binnenkomende of bestaande rijen de rijstatus Addedhebben, worden de primaire-sleutelwaarden vergeleken met de Current primaire-sleutelwaarde van de Added rij omdat er geen Original rijversie bestaat.

Als een binnenkomende tabel en een bestaande tabel een kolom met dezelfde naam maar verschillende gegevenstypen bevatten, wordt er een uitzondering gegenereerd en wordt de MergeFailed gebeurtenis van de DataSet tabel gegenereerd. Als een binnenkomende tabel en een bestaande tabel beide sleutels hebben gedefinieerd, maar de primaire sleutels voor verschillende kolommen zijn, wordt er een uitzondering gegenereerd en wordt de MergeFailed gebeurtenis van de DataSet tabel gegenereerd.

Als de tabel die nieuwe gegevens van een samenvoeging ontvangt, geen primaire sleutel heeft, kunnen nieuwe rijen van de binnenkomende gegevens niet worden vergeleken met bestaande rijen in de tabel en worden ze in plaats daarvan toegevoegd aan de bestaande tabel.

Tabelnamen en naamruimten

DataTable objecten kunnen eventueel een Namespace eigenschapswaarde worden toegewezen. Wanneer Namespace waarden worden toegewezen, kan een object DataSet met dezelfde TableName waarde meerdere DataTable objecten bevatten. Tijdens samenvoegbewerkingen worden beide TableName gebruikt Namespace om het doel van een samenvoegbewerking te identificeren. Als er geen Namespace is toegewezen, wordt alleen het TableName doel van een samenvoeging geïdentificeerd.

Notitie

Dit gedrag is gewijzigd in versie 2.0 van .NET Framework. In versie 1.1 werden naamruimten ondersteund, maar genegeerd tijdens samenvoegbewerkingen. Daarom heeft een DataSet die eigenschapswaarden gebruikt Namespace , verschillende gedragingen, afhankelijk van de versie van het .NET Framework dat u uitvoert. Stel dat u twee DataSets DataTables met dezelfde TableName eigenschapswaarden hebt, maar verschillende Namespace eigenschapswaarden. In versie 1.1 van .NET Framework worden de verschillende Namespace namen genegeerd bij het samenvoegen van de twee DataSet objecten. Vanaf versie 2.0 zorgt samenvoegen er echter voor dat er twee nieuwe DataTables worden gemaakt in het doel DataSet. Het origineel DataTables wordt niet beïnvloed door de samenvoeging.

PreserveChanges

Wanneer u een DataSet, DataTableof DataRow matrix doorgeeft aan de Merge methode, kunt u optionele parameters opnemen die aangeven of wijzigingen in de bestaande DataSetal dan niet moeten worden bewaard en hoe nieuwe schema-elementen in de binnenkomende gegevens moeten worden verwerkt. De eerste van deze parameters na de binnenkomende gegevens is een Booleaanse vlag, PreserveChangesdie aangeeft of de wijzigingen in de bestaande DataSetal dan niet moeten worden bewaard. Als de PreserveChanges vlag is ingesteld op true, overschrijven binnenkomende waarden bestaande waarden niet in de Current rijversie van de bestaande rij. Als de PreserveChanges vlag is ingesteld op false, overschrijven binnenkomende waarden de bestaande waarden in de Current rijversie van de bestaande rij. Als de PreserveChanges vlag niet is opgegeven, is deze standaard ingesteld false op. Zie Rijstatussen en rijversies voor meer informatie over rijversies.

Wanneer PreserveChanges zijn truede gegevens uit de bestaande rij behouden in de Current rijversie van de bestaande rij, terwijl de gegevens uit de Original rijversie van de bestaande rij worden overschreven met de gegevens uit de Original rijversie van de binnenkomende rij. De RowState bestaande rij is ingesteld op Modified. De volgende uitzonderingen zijn van toepassing:

  • Als de bestaande rij een RowState van Deletedheeft, blijft deze RowState behouden Deleted en is deze niet ingesteld op Modified. In dit geval worden de gegevens uit de binnenkomende rij nog steeds opgeslagen in de Original rijversie van de bestaande rij, waarbij de Original rijversie van de bestaande rij wordt overschreven (tenzij de binnenkomende rij een RowState van Addedheeft).

  • Als de binnenkomende rij een RowState van Addedheeft, worden de gegevens uit de Original rijversie van de bestaande rij niet overschreven met gegevens uit de binnenkomende rij, omdat de binnenkomende rij geen rijversie heeft Original .

Wanneer PreserveChanges worden falsezowel de versies van de Current rij als Original de rij in de bestaande rij overschreven met de gegevens uit de binnenkomende rij en wordt de RowState bestaande rij ingesteld op de RowState inkomende rij. De volgende uitzonderingen zijn van toepassing:

  • Als de binnenkomende rij een RowState van Unchanged heeft en de bestaande rij een RowState van Modified, Deletedof Added, de RowState bestaande rij is ingesteld Modifiedop .

  • Als de binnenkomende rij een RowState van Addedheeft en de bestaande rij een RowState van Unchanged, Modifiedof Deleted, of , de RowState bestaande rij is ingesteld op Modified. Bovendien worden de gegevens uit de Original rijversie van de bestaande rij niet overschreven met gegevens uit de binnenkomende rij, omdat de binnenkomende rij geen rijversie heeft Original .

MissingSchemaAction

U kunt de optionele MissingSchemaAction parameter van de Merge methode gebruiken om op te geven hoe Merge schema-elementen worden verwerkt in de binnenkomende gegevens die geen deel uitmaken van de bestaande DataSet.

In de volgende tabel worden de opties voor MissingSchemaAction.

Optie MissingSchemaAction Beschrijving
Add Voeg de nieuwe schemagegevens toe aan de DataSet en vul de nieuwe kolommen in met de binnenkomende waarden. Dit is de standaardinstelling.
AddWithKey Voeg het nieuwe schema en de primaire sleutelgegevens toe aan de DataSet en vul de nieuwe kolommen in met de binnenkomende waarden.
Error Er wordt een uitzondering gegenereerd als er niet-overeenkomende schemagegevens worden aangetroffen.
Ignore Negeer de nieuwe schemagegevens.

Beperkingen

Met de Merge methode worden beperkingen pas gecontroleerd als alle nieuwe gegevens aan de bestaande DataSetgegevens zijn toegevoegd. Zodra de gegevens zijn toegevoegd, worden er beperkingen afgedwongen voor de huidige waarden in de DataSet. U moet ervoor zorgen dat uw code eventuele uitzonderingen verwerkt die kunnen worden gegenereerd vanwege schendingen van beperkingen.

Overweeg een geval waarin een bestaande rij in een DataSet rij een Unchanged rij is met een primaire-sleutelwaarde van 1. Tijdens een samenvoegbewerking met een Modified binnenkomende rij met een Original primaire-sleutelwaarde van 2 en een Current primaire-sleutelwaarde van 1, worden de bestaande rij en de binnenkomende rij niet beschouwd als overeenkomend omdat de Original primaire-sleutelwaarden verschillen. Wanneer de samenvoegbewerking is voltooid en beperkingen worden gecontroleerd, wordt er echter een uitzondering gegenereerd omdat de waarden van de Current primaire sleutel de unieke beperking voor de kolom met de primaire sleutel schenden.

Notitie

Wanneer rijen worden ingevoegd in een databasetabel met een kolom die automatisch wordt verhoogd, zoals een identiteitskolom, komt de waarde van de identiteitskolom die door de invoeging wordt geretourneerd mogelijk niet overeen met de waarde in de DataSettabel, waardoor de geretourneerde rijen worden toegevoegd in plaats van samengevoegd. Zie Identiteits- of Autonummeringswaarden ophalen voor meer informatie.

In het volgende codevoorbeeld worden twee DataSet objecten samengevoegd met verschillende schema's in één DataSet met de gecombineerde schema's van de twee binnenkomende DataSet objecten.

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

In het volgende codevoorbeeld wordt een bestaande DataSet met updates gebruikt en worden deze updates doorgegeven aan een DataAdapter update die moet worden verwerkt in de gegevensbron. De resultaten worden vervolgens samengevoegd in het oorspronkelijke DataSet. Nadat wijzigingen zijn geweigerd die tot een fout hebben geleid, worden de samengevoegde wijzigingen doorgevoerd met 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

Zie ook