Freigeben über


Gewusst wie: Speichern von Datasetänderungen in einer Datenbank

 

Veröffentlicht: Juli 2016

Nachdem die Daten im Dataset geändert und überprüft wurden, möchten Sie die aktualisierten Daten möglicherweise an die Datenbank zurücksenden. Wenn die geänderten Daten an die Datenbank gesendet werden sollen, rufen Sie die Update-Methode eines TableAdapter oder Datenadapters 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 korrekten Befehl (INSERT, UPDATE oder DELETE) aus.

Beim Speichern von Daten in verknüpften Tabellen wird von Visual Studio eine neue TableAdapterManager-Komponente bereitgestellt, die Hilfe beim Speichern in der richtigen Reihenfolge basierend auf den in der Datenbank festgelegten Fremdschlüsseleinschränkungen bietet. Weitere Informationen finden Sie unter Übersicht über die hierarchische Aktualisierung.

Hinweis

Weil bei dem Versuch der Aktualisierung einer Datenquelle mit dem Inhalt eines Datasets 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. Führen Sie Code aus, der versucht, Aktualisierungen an die Datenbank in einem try/catch-Block zu senden.

  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 die Aktualisierung (HasErrors-Eigenschaft, GetErrors-Methode).

Speichern von Daten in einer Datenbank

Rufen Sie die Update-Methode eines TableAdapter oder Datenadapters auf, indem Sie den Namen der Datentabelle übergeben, in der die Werte enthalten sind, die in die Datenbank geschrieben werden sollen. Weitere Informationen zum Speichern von Daten aus einer einzelnen Datentabelle in einer Datenbank finden Sie unter Exemplarische Vorgehensweise: Speichern von Daten in einer Datenbank (eine Tabelle).

So aktualisieren Sie eine Datenbank mit einem Dataset mithilfe eines TableAdapter

  • Schließen Sie die TableAdapter.Update-Methode in einem try/catch-Block ein. Im folgenden Beispiel wird veranschaulicht, wie eine Aktualisierung mit dem Inhalt der Customers-Tabelle in NorthwindDataSet ausgeführt werden kann.

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

So aktualisieren Sie eine Datenbank mit einem Dataset mithilfe eines Datenadapters

  • Schließen Sie die DataAdapter.Update-Methode in einem try/catch-Block ein. Im folgenden Beispiel wird veranschaulicht, wie eine Datenquelle mit dem Inhalt von Table1 in DataSet1 aktualisiert werden kann.

    try
    {
        SqlDataAdapter1.Update(Dataset1.Tables["Table1"]);
    }
    catch (Exception e)
    {
        // Error during Update, add code to locate error, reconcile 
        // and try to update again.
    }
    
    Try
        SqlDataAdapter1.Update(Dataset1.Tables("Table1"))
    
    Catch x As Exception
        ' Error during Update, add code to locate error, reconcile 
        ' and try to update again.
    End Try
    

Aktualisieren von zwei verknüpften Tabellen in einem Dataset

Bei der Aktualisierung verknüpfter Tabellen in einem Dataset ist es wichtig, die richtige Reihenfolge einzuhalten, um nicht unnötig Einschränkungen für die referenzielle Integrität zu verletzen. 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.

Ausführliche Informationen zum Speichern von Daten aus mehreren Tabellen finden Sie unter Exemplarische Vorgehensweise: Speichern von Daten in einer Datenbank (mehrere Tabellen).

Wenn Sie zwei oder mehr verknüpfte Tabellen aktualisieren, dann müssen Sie die gesamte Aktualisierungslogik einer Transaktion miteinbeziehen. Durch den Prozess der Transaktion wird sichergestellt, 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.

So aktualisieren Sie zwei verknüpfte Tabellen mit einem TableAdapter

  1. Erstellen Sie drei temporäre DataTable für die unterschiedlichen Datensätze.

  2. Rufen Sie die Update-Methode für jede Teilmenge der Zeilen in einem try/catch-Block auf. Falls Aktualisierungsfehler auftreten, empfiehlt es sich, die Fehler durch eine Verzweigung zu beheben.

  3. Übertragen Sie die Änderungen vom Dataset in die Datenbank.

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

    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();
            }
        }
    }
    
    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
    

So aktualisieren Sie zwei verknüpfte Tabellen mit einem Datenadapter

  • Rufen Sie die Update-Methode jedes Datenadapters auf.

    Im folgenden Beispiel wird erläutert, wie Sie eine Datenquelle mit einem Dataset aktualisieren, das verknüpfte Tabellen enthält. Damit die oben angegebene Reihenfolge eingehalten wird, werden drei temporäre DataTable für die unterschiedlichen Datensätze erstellt. Anschließend wird die Update-Methode für jede Teilmenge von Zeilen in einem try/catch-Block aufgerufen. Falls Aktualisierungsfehler auftreten, empfiehlt es sich, die Fehler durch eine Verzweigung zu beheben. Anschließend führt das Dataset einen Commit für die Änderungen aus. Löschen Sie abschließend die temporären Datentabellen, um die Ressourcen freizugeben.

    void UpdateDB()
    {
        System.Data.DataTable DeletedChildRecords = 
            dsNorthwind1.Orders.GetChanges(System.Data.DataRowState.Deleted);
    
        System.Data.DataTable NewChildRecords = 
            dsNorthwind1.Orders.GetChanges(System.Data.DataRowState.Added);
    
        System.Data.DataTable ModifiedChildRecords = 
            dsNorthwind1.Orders.GetChanges(System.Data.DataRowState.Modified);
    
        try
        {
            if (DeletedChildRecords != null)
            {
                daOrders.Update(DeletedChildRecords);
            }
            if (NewChildRecords != null)
            {
                daOrders.Update(NewChildRecords);
            }
            if (ModifiedChildRecords != null)
            {
                daOrders.Update(ModifiedChildRecords);
            }
    
            dsNorthwind1.AcceptChanges();
        }
    
        catch (Exception ex)
        {
            // Update error, resolve and try again
        }
    
        finally
        {
            if (DeletedChildRecords != null)
            {
                DeletedChildRecords.Dispose();
            }
            if (NewChildRecords != null)
            {
                NewChildRecords.Dispose();
            }
            if (ModifiedChildRecords != null)
            {
                ModifiedChildRecords.Dispose();
            }
        }
    }
    
    Private Sub UpdateDB()
        Dim DeletedChildRecords As DataTable =
            dsNorthwind1.Orders.GetChanges(DataRowState.Deleted)
    
        Dim NewChildRecords As DataTable =
            dsNorthwind1.Orders.GetChanges(DataRowState.Added)
    
        Dim ModifiedChildRecords As DataTable =
            dsNorthwind1.Orders.GetChanges(DataRowState.Modified)
    
        Try
            If Not DeletedChildRecords Is Nothing Then
                daOrders.Update(DeletedChildRecords)
            End If
    
            daCustomers.Update(dsNorthwind1, "Customers")
    
            If Not NewChildRecords Is Nothing Then
                daOrders.Update(NewChildRecords)
            End If
    
            If Not ModifiedChildRecords Is Nothing Then
                daOrders.Update(ModifiedChildRecords)
            End If
    
            dsNorthwind1.AcceptChanges()
    
        Catch ex As Exception
            ' Update error, resolve and try again
    
        Finally
            If Not DeletedChildRecords Is Nothing Then
                DeletedChildRecords.Dispose()
            End If
    
            If Not NewChildRecords Is Nothing Then
                NewChildRecords.Dispose()
            End If
    
            If Not ModifiedChildRecords Is Nothing Then
                ModifiedChildRecords.Dispose()
            End If
        End Try
    End Sub
    

Siehe auch

Exemplarische Vorgehensweisen zur Arbeit mit Daten
Binden von Windows Forms-Steuerelementen an Daten in Visual Studio
Herstellen von Datenverbindungen in Visual Studio
Vorbereiten der Anwendung auf den Empfang von Daten
Abrufen von Daten für die Anwendung
Binden von Steuerelementen an Daten in Visual Studio
Bearbeiten von Daten in der Anwendung
Überprüfen von Daten
Speichern von Daten