Freigeben über


Gewusst wie: Aktualisieren von Daten mit einem TableAdapter

Aktualisiert: April 2011

Nachdem die Daten im Dataset geändert und überprüft wurden, möchten Sie die aktualisierten Daten möglicherweise an die Datenbank zurücksenden. Um die geänderten Daten an eine Datenbank zu senden, rufen Sie die Update-Methode für einen TableAdapter auf. Die Update-Methode des Adapters aktualisiert eine einzelne Datentabelle und führt auf der Grundlage des RowState der einzelnen Datenzeilen in der Tabelle den entsprechenden Befehl (INSERT, UPDATE oder DELETE) aus. Beim Speichern von Daten in verknüpften Tabellen wird von Visual Studio eine neue TableAdapterManager-Komponente bereitgestellt, die beim Speichern in der korrekten Reihenfolge basierend auf den in der Datenbank festgelegten Fremdschlüsseleinschränkungen hilft. Weitere Informationen finden Sie unter Übersicht über die hierarchische Aktualisierung.

Tipp

Da bei dem Versuch, eine Datenquelle mit dem Inhalt eines DataSet zu aktualisieren, Fehler auftreten können, sollte der Code, der die Update-Methode des Adapters aufruft, in einem try/catch-Block platziert werden.

Die genaue Verfahrensweise zum Aktualisieren einer Datenquelle kann je nach Unternehmensanforderungen variieren. Die folgenden Schritte sollten jedoch von der Anwendung ausgeführt werden:

  1. Rufen Sie die Update-Methode des Adapters in einem try/catch-Block auf.

  2. Lokalisieren der fehlerhaften Datenzeile, falls eine Ausnahme abgefangen wird. Weitere Informationen finden Sie unter Gewusst wie: Suchen nach Zeilen mit Fehlern.

  3. Beheben Sie das Problem in der Datenzeile (möglichst programmgesteuert oder indem die ungültige Zeile dem Benutzer zur Änderung angezeigt wird), und wiederholen Sie dann den Aktualisierungsversuch (HasErrors, GetErrors).

Speichern von Daten in einer Datenbank

Rufen Sie die Update-Methode eines TableAdapter auf, und übergeben Sie den Namen der Datentabelle, die die in die Datenbank zu schreibenden Werte enthält.

Wichtig

Wenn Sie eine lokale Datenbank, z. B. eine MDF-Datei, verwenden, darf die Eigenschaft In Ausgabeverzeichnis kopieren der Datei nicht auf Immer kopieren festgelegt sein. Wenn die Eigenschaft auf Immer kopieren festgelegt ist, überschreibt die Datei beim Erstellen des Projekts alle Änderungen, die Sie an der lokalen Datenbank vornehmen. Um dieses Problem zu beheben, klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf die Datei, klicken Sie auf Eigenschaften, und ändern Sie den Wert von In Ausgabeverzeichnis kopieren.

So aktualisieren Sie eine Datenbank mit einem DataSet mithilfe eines TableAdapter

  • Schließen Sie die Update-Methode des Adapters in einen try/catch-Block ein. Im folgenden Beispiel wird veranschaulicht, wie eine Aktualisierung mit dem Inhalt der Customers-Tabelle in NorthwindDataSet innerhalb eines try/catch-Blocks versucht wird.

    Try
        Me.Validate()
        Me.CustomersBindingSource.EndEdit()
        Me.CustomersTableAdapter.Update(Me.NorthwindDataSet.Customers)
        MsgBox("Update successful")
    
    Catch ex As Exception
        MsgBox("Update failed")
    End Try
    
    try
    {
        this.Validate();
        this.customersBindingSource.EndEdit();
        this.customersTableAdapter.Update(this.northwindDataSet.Customers);
        MessageBox.Show("Update successful");
    }
    catch (System.Exception ex)
    {
        MessageBox.Show("Update failed");
    }
    

Aktualisieren von zwei verknüpften Tabellen in einem Dataset mittels TableAdapter

Bei der Aktualisierung verknüpfter Tabellen in einem DatasSet muss die richtige Reihenfolge eingehalten werden, damit nicht unnötig Einschränkungen für die referenzielle Integrität verletzt werden. Die in der Befehlsausführung verwendete Abfolge richtet sich zusätzlich nach den Indizes von DataRowCollection im Dataset. Um zu verhindern, dass Integritätsfehler ausgelöst werden, wird bei der Aktualisierung der Datenbank die folgende Reihenfolge empfohlen:

  1. Untergeordnete Tabelle: Datensätze löschen.

  2. Übergeordnete Tabelle: Datensätze einfügen, aktualisieren und löschen.

  3. Untergeordnete Tabelle: Datensätze einfügen und aktualisieren.

    Tipp

    Wenn Sie zwei oder mehr verknüpfte Tabellen aktualisieren, muss die gesamte Aktualisierungslogik in einer Transaktion enthalten sein. Eine Transaktion ist ein Prozess zum Sicherstellen, dass alle mit einer Datenbank verbundenen Änderungen erfolgreich sind, bevor ein Commit der Änderungen ausgeführt wird. Weitere Informationen finden Sie unter Transaktionen und Parallelität (ADO.NET).

So aktualisieren Sie zwei verknüpfte Tabellen mittels TableAdapter

  1. Erstellen Sie drei temporäre Datentabellen, die die unterschiedlichen Datensätze enthalten.

  2. Rufen Sie die Update-Methode für jede Teilmenge der Zeilen in einem try/catch-Block auf. Wenn Aktualisierungsfehler auftreten, müssen diese durch eine Verzweigung behoben werden.

  3. Übernehmen Sie die Änderungen in der Datenbank.

  4. Löschen Sie die temporären Datentabellen, um die Ressourcen freizugeben.

    Im folgenden Beispiel wird erläutert, wie Sie eine Datenquelle mit einem Dataset aktualisieren, das verknüpfte Tabellen enthält.

    Private Sub UpdateDB()
        Dim deletedChildRecords As NorthwindDataSet.OrdersDataTable =
            CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Deleted), NorthwindDataSet.OrdersDataTable)
    
        Dim newChildRecords As NorthwindDataSet.OrdersDataTable =
            CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Added), NorthwindDataSet.OrdersDataTable)
    
        Dim modifiedChildRecords As NorthwindDataSet.OrdersDataTable =
            CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Modified), NorthwindDataSet.OrdersDataTable)
    
        Try
            If deletedChildRecords IsNot Nothing Then
                OrdersTableAdapter.Update(deletedChildRecords)
            End If
    
            CustomersTableAdapter.Update(NorthwindDataSet.Customers)
    
            If newChildRecords IsNot Nothing Then
                OrdersTableAdapter.Update(newChildRecords)
            End If
    
            If modifiedChildRecords IsNot Nothing Then
                OrdersTableAdapter.Update(modifiedChildRecords)
            End If
    
            NorthwindDataSet.AcceptChanges()
    
        Catch ex As Exception
            MessageBox.Show("An error occurred during the update process")
            ' Add code to handle error here.
    
        Finally
            If deletedChildRecords IsNot Nothing Then
                deletedChildRecords.Dispose()
            End If
    
            If newChildRecords IsNot Nothing Then
                newChildRecords.Dispose()
            End If
    
            If modifiedChildRecords IsNot Nothing Then
                modifiedChildRecords.Dispose()
            End If
    
        End Try
    End Sub
    
    void UpdateDB()
    {
        NorthwindDataSet.OrdersDataTable deletedChildRecords = 
            (NorthwindDataSet.OrdersDataTable)northwindDataSet.Orders.GetChanges(DataRowState.Deleted);
    
        NorthwindDataSet.OrdersDataTable newChildRecords = 
            (NorthwindDataSet.OrdersDataTable)northwindDataSet.Orders.GetChanges(DataRowState.Added);
    
        NorthwindDataSet.OrdersDataTable modifiedChildRecords = 
            (NorthwindDataSet.OrdersDataTable)northwindDataSet.Orders.GetChanges(DataRowState.Modified);
    
        try
        {
            if (deletedChildRecords != null)
            {
                ordersTableAdapter.Update(deletedChildRecords);
            }
    
            customersTableAdapter.Update(northwindDataSet.Customers);
    
            if (newChildRecords != null)
            {
                ordersTableAdapter.Update(newChildRecords);
            }
    
            if (modifiedChildRecords != null)
            {
                ordersTableAdapter.Update(modifiedChildRecords);
            }
    
            northwindDataSet.AcceptChanges();
        }
    
        catch (Exception ex)
        {
            MessageBox.Show("An error occurred during the update process");
            // Add code to handle error here.
        }
    
        finally
        {
            if (deletedChildRecords != null)
            {
                deletedChildRecords.Dispose();
            }
            if (newChildRecords != null)
            {
                newChildRecords.Dispose();
            }
            if (modifiedChildRecords != null)
            {
                modifiedChildRecords.Dispose();
            }
        }
    }
    

Siehe auch

Konzepte

Übersicht über TableAdapters

Binden von Windows Forms-Steuerelementen an Daten in Visual Studio

Binden von Steuerelementen an Daten in Visual Studio

Weitere Ressourcen

Exemplarische Vorgehensweisen zur Arbeit mit Daten

Herstellen von Datenverbindungen in Visual Studio

Vorbereiten der Anwendung auf den Empfang von Daten

Abrufen von Daten für die Anwendung

Bearbeiten von Daten in der Anwendung

Überprüfen von Daten

Speichern von Daten

Änderungsprotokoll

Datum

Versionsgeschichte

Grund

April 2011

Mögliche Probleme mit der Einstellung In Ausgabeverzeichnis kopieren für eine lokale Datenbankdatei behandelt.

Kundenfeedback.