Procedura: aggiornare i dati mediante un TableAdapter

 

Data di pubblicazione: aprile 2016

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 dei 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.

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
                {
                    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
    

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.

Per aggiornare due tabelle correlate mediante 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.

            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
    

Vedere anche

Cenni preliminari sugli oggetti TableAdapter
Procedure dettagliate relative ai dati
Associazione di controlli Windows Form ai dati in Visual Studio
Connessione ai dati in Visual Studio
Preparazione dell'applicazione al ricevimento di dati
Recupero di dati nell'applicazione
Associazione di controlli ai dati in Visual Studio
Modifica di dati nell'applicazione
Convalida dei dati
Salvataggio di dati