Procedura: salvare le modifiche di un dataset in un database
Pubblicato: luglio 2016
Dopo aver modificato e convalidato i dati del dataset in uso, è possibile inviare i dati aggiornati a un database. Per eseguire questa operazione, chiamare il metodo Update di un oggetto TableAdapter o adattatore dati. 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ò provocare degli errori, è necessario posizionare 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:
Eseguire il codice che consente di inviare gli aggiornamenti al database 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 dei dati in un database
Chiamare il metodo Update di un oggetto TableAdapter o di un adattatore dati passando il nome della tabella di dati contenente i valori da scrivere nel database. Per ulteriori informazioni sul salvataggio dei dati da una singola tabella di dati in un database, vedere Procedura dettagliata: salvataggio di dati in un database (a tabella singola).
Per aggiornare un database con un dataset mediante un TableAdapter
Racchiudere il metodo TableAdapter.Update all'interno di un blocco try/catch. Nel seguente esempio viene illustrato un tentativo di aggiornamento 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
Per aggiornare un database con un dataset mediante un adattatore dati
Racchiudere il metodo DataAdapter.Update all'interno di un blocco try/catch. Nel seguente esempio viene illustrata la procedura per tentare l'aggiornamento di un'origine dati con il contenuto di Table1 in DataSet1.
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
Aggiornamento di due tabelle correlate in un dataset
Quando si aggiornano le tabelle correlate in un dataset, è importante 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.
Per informazioni dettagliate sul salvataggio dei dati di più tabelle, vedere Procedura dettagliata: salvataggio di dati in un database (a più tabelle).
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
Creare tre oggetti DataTable temporanei in cui collocare i diversi record.
Chiamare il metodo Update per ciascun sottoinsieme di righe dall'interno di un blocco try/catch. Se si verificano errori di aggiornamento, l'operazione da eseguire consiste nell'interrompere il processo e risolverli.
Eseguire il commit delle modifiche dal dataset al database.
Eliminare le tabelle di dati temporanee per liberare le risorse.
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
Per aggiornare due tabelle correlate mediante un adattatore dati
Chiamare il metodo Update di ciascun adattatore dati.
Nell'esempio seguente viene illustrata la procedura per aggiornare un'origine dati con un dataset che contiene tabelle correlate. Per rispettare la sequenza sopra riportata, verranno creati tre oggetti DataTable temporanei per contenere i diversi record. Verrà quindi chiamato il metodo Update per ciascun sottoinsieme di righe dall'interno di un blocco try/catch. Se si verificano errori di aggiornamento, l'operazione da eseguire consiste nell'interrompere il processo e risolverli. Verranno quindi applicate le modifiche. Eliminare infine gli oggetti tabelle di dati temporanei per liberare le risorse.
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
Vedere anche
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