Procedura: salvare le modifiche di un dataset in un database
Aggiornamento: novembre 2007
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 2008 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 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"); }
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 x As Exception ' Error during Update, add code to locate error, reconcile ' and try to update again. End Try
try { SqlDataAdapter1.Update(Dataset1.Tables["Table1"]); } catch (Exception e) { // Error during Update, add code to locate error, reconcile // and try to update again. }
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 (ADO.NET).
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 gli oggetti DataTable temporanei per liberare le risorse.
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(); } } }
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.
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
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(); } } }
Vedere anche
Concetti
Cenni preliminari sulla visualizzazione dei dati
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
Visualizzazione di dati su form nelle applicazioni Windows