Condividi tramite


Procedura: aggiornare i dati mediante un TableAdapter

Dopo aver modificato e convalidato i dati del dataset in uso, è possibile inviare i dati aggiornati a un database. A tale scopo, viene chiamato il metodo Update di un oggetto TableAdapter. Il metodo Update dell'adattatore consente di aggiornare una tabella di dati singola e di eseguire il comando corretto (INSERT, UPDATE o DELETE) in base alla proprietà RowState di ciascuna riga di dati della tabella. Quando si salvano i dati nelle tabelle correlate, Visual Studio fornisce un nuovo componente TableAdapterManager che consente di eseguire i salvataggi nell'ordine corretto in base ai vincoli di chiave esterna definiti nel database. Per ulteriori informazioni, vedere Cenni preliminari sull'aggiornamento gerarchico.

Nota

Poiché il tentativo di aggiornare un'origine dati con il contenuto di un dataset può causare errori, è necessario immettere il codice che chiama il metodo Update dell'adattatore all'interno di un blocco try/catch.

La procedura corretta per aggiornare un'origine dati può variare a seconda delle esigenze aziendali, ma l'applicazione dovrà comprendere i seguenti passaggi:

  1. Chiamare il metodo Update dell'adattatore all'interno di un blocco try/catch.

  2. Se si intercetta un'eccezione, individuare la riga di dati che ha provocato l'errore. Per ulteriori informazioni, vedere Procedura: individuare righe con errori.

  3. Risolvere il problema nella riga di dati, se possibile a livello di codice oppure presentando la riga non valida all'utente per la modifica, quindi tentare nuovamente l'aggiornamento (proprietà HasErrors, metodo GetErrors).

Salvataggio di dati in un database

Chiamare il metodo Update di un TableAdapter, passando il nome della tabella di dati che contiene i valori da scrivere nel database.

Nota importanteImportante

Quando si utilizza un database locale, ad esempio un file con estensione mdf, la proprietà Copia nella directory di output del file non deve essere impostata su Copia sempre. Se la proprietà è impostata su Copia sempre, quando si compila il progetto, il file sovrascriverà tutte le modifiche apportate al database locale. Per correggere il problema, in Esplora soluzioni fare clic con il pulsante destro del mouse sul file, scegliere Proprietà, quindi modificare il valore di Copia nella directory di output.

Per aggiornare un database con un dataset mediante un TableAdapter

  • Racchiudere il metodo Update dell'adattatore all'interno di un blocco try/catch. Nell'esempio che segue viene illustrato un tentativo di aggiornamento dall'interno di un blocco try/catch con il contenuto della tabella Customers nel dataset NorthwindDataSet.

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

Aggiornamento di due tabelle correlate di un dataset con un TableAdapter

Quando si aggiornano le tabelle correlate in un dataset, è necessario effettuare l'aggiornamento nella sequenza corretta, in modo da ridurre la possibilità di violare i vincoli di integrità referenziale. L'ordine di esecuzione dei comandi seguirà anche gli indici dell'oggetto DataRowCollection nel dataset. Per impedire che vengano generati errori di integrità dei dati, è preferibile aggiornare il database rispettando questa sequenza:

  1. Tabella figlio: eliminare i record.

  2. Tabella padre: inserire, aggiornare ed eliminare i record.

  3. Tabella figlio: inserire e aggiornare i record.

    Nota

    Se è in corso l'aggiornamento di due o più tabelle correlate, includere tutta la logica di aggiornamento all'interno di una transazione. Una transazione è un processo che garantisce il corretto inserimento di tutte le modifiche correlate in un database prima del relativo commit. Per ulteriori informazioni, vedere Transazioni e concorrenza (ADO.NET).

Per aggiornare due tabelle correlate utilizzando un TableAdapter

  1. Creare tre tabelle di dati temporanee in cui collocare i diversi record.

  2. Chiamare il metodo Update per ciascun sottoinsieme di righe da un blocco try/catch. Se si verificano errori di aggiornamento, interrompere il processo e risolverli.

  3. Eseguire il commit delle modifiche nel database.

  4. Eliminare le tabelle di dati temporanee per liberare le risorse.

    Nell'esempio seguente viene illustrata la procedura per aggiornare un'origine dati con un dataset che contiene tabelle correlate.

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

Vedere anche

Concetti

Cenni preliminari sugli oggetti TableAdapter

Associazione di controlli Windows Form ai dati in Visual Studio

Associazione di controlli ai dati in Visual Studio

Altre risorse

Procedure dettagliate relative ai dati

Connessione ai dati in Visual Studio

Preparazione dell'applicazione al ricevimento di dati

Recupero di dati nell'applicazione

Modifica di dati nell'applicazione

Convalida dei dati

Salvataggio di dati

Cronologia delle modifiche

Data

Cronologia

Motivo

Aprile 2011

Risolti possibili problemi con l'impostazione Copia nella directory di output per un file di database locale.

Commenti e suggerimenti dei clienti.