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:
Chiamare il metodo Update dell'adattatore all'interno di un blocco try/catch.
Se si intercetta un'eccezione, individuare la riga di dati che ha provocato l'errore. Per ulteriori informazioni, vedere Procedura: individuare righe con errori.
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.
Importante |
---|
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:
Tabella figlio: eliminare i record.
Tabella padre: inserire, aggiornare ed eliminare i record.
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
Creare tre tabelle di dati temporanee in cui collocare i diversi record.
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.
Eseguire il commit delle modifiche nel database.
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
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. |