Procedura dettagliata: salvataggio di dati in un database (a più tabelle)
In uno degli scenari più comuni nello sviluppo delle applicazioni i dati vengono prima visualizzati in un form di un'applicazione Windows, quindi modificati e infine, così aggiornati, inviati nuovamente al database. Nella presente procedura dettagliata viene creato un form nel quale vengono visualizzati dati provenienti da due tabelle correlate e viene illustrato come modificare i record e salvare le modifiche nuovamente nel database. In questo esempio vengono utilizzate le tabelle Customerse Orders del database di esempio Northwind.
I dati dell'applicazione possono essere nuovamente salvati nel database chiamando il metodo Update di un oggetto TableAdapter. Quando si trascinano degli elementi dalla finestra Origini dati, viene automaticamente aggiunto il codice per salvare i dati per la prima tabella trascinata sul form. Per tutte le altre tabelle aggiunte al form occorrerà aggiungere manualmente il codice necessario per salvare i dati. In questa procedura dettagliata viene illustrato come aggiungere il codice per salvare gli aggiornamenti effettuati in più tabelle.
Nota
È possibile che le finestre di dialogo e i comandi di menu visualizzati siano diversi da quelli descritti nella Guida a seconda delle impostazioni attive o dell'edizione del programma. Per modificare le impostazioni, scegliere Importa/Esporta impostazioni dal menu Strumenti. Per ulteriori informazioni, vedere Gestione delle impostazioni.
Di seguito sono elencate le attività illustrate nella procedura dettagliata:
Creazione di un nuovo progetto Applicazione Windows.
Creazione e configurazione di un'origine dati in un'applicazione utilizzando la Configurazione guidata origine dati.
Impostazione dei controlli degli elementi nella Origini dati (finestra). Per ulteriori informazioni, vedere Procedura: impostare il controllo da creare per il trascinamento dalla finestra Origini dati.
Creazione dei controlli associati a dati mediante il trascinamento degli elementi dalla finestra Origini dati nel form.
Modifica di un paio di record in ogni tabella del dataset.
Modifica del codice in modo da inviare i dati aggiornati del dataset al database.
Prerequisiti
Per completare questa procedura dettagliata è necessario:
- Accedere al database di esempio Northwind. Per ulteriori informazioni, vedere Procedura: installare database di esempio.
Creazione dell'applicazione Windows
Il primo passaggio consiste nella creazione di un'Applicazione Windows. Sebbene in questo passaggio l'assegnazione di un nome al progetto sia facoltativa, il nome verrà assegnato comunque in quanto si desidera salvare il progetto successivamente.
Per creare il nuovo progetto Applicazione Windows
Scegliere il comando per la creazione di un nuovo progetto dal menu File.
Assegnare al progetto il nome UpdateMultipleTablesWalkthrough.
Selezionare Applicazione Windows e scegliere OK. Per ulteriori informazioni, vedere Creazione di applicazioni per Windows.
Il progetto UpdateMultipleTablesWalkthrough verrà creato e aggiunto a Esplora soluzioni.
Creazione dell'origine dati
In questo passaggio verrà creata un'origine dati dal database Northwind utilizzando la Configurazione guidata origine dati. Per creare la connessione è necessario disporre di accesso al database di esempio Northwind. Per informazioni sull'impostazione del database di esempio Northwind, vedere Procedura: installare database di esempio.
Per creare l'origine dati
Scegliere Mostra origini dati dal menu Dati.
Nella finestra Origini dati scegliere Aggiungi nuova origine dati per avviare la Configurazione guidata origine dati.
Selezionare Database nella pagina Scegliere un tipo di origine dati e scegliere Avanti.
Nella pagina Seleziona connessione dati effettuare una delle seguenti operazioni:
Selezionare la connessione dati al database di esempio Northwind nell'elenco a discesa, se presente.
- oppure -
Selezionare Nuova connessione per aprire la finestra di dialogo Aggiungi/Modifica connessione. Per ulteriori informazioni, vedere Finestra di dialogo Aggiungi/Modifica connessione (generale).
Se il database in uso richiede una password, selezionare l'opzione che consente di includere dati riservati, quindi scegliere Avanti.
Scegliere Avanti nella pagina Salva la stringa di connessione nel file di configurazione dell'applicazione.
Espandere il nodo Tabelle nella pagina Seleziona oggetti di database.
Selezionare le tabelle Customers e Orders, quindi scegliere Fine.
L'oggetto NorthwindDataSet viene aggiunto al progetto e le tabelle vengono visualizzate nella finestra Origini dati.
Impostazione dei controlli da creare
In questa procedura dettagliata i dati della tabella Customers verranno presentati con il layout Dettagli, ovvero verranno visualizzati in singoli controlli. I dati della tabella Orders verranno presentati con il layout Griglia all'interno di un controllo DataGridView.
Per impostare il tipo di visualizzazione degli elementi della finestra Origini dati
Espandere il nodo Customers nella finestra Origini dati.
Impostare il controllo della tabella Customers sui singoli controlli selezionando Dettagli dall'elenco dei controlli del nodo Customers. Per ulteriori informazioni, vedere Procedura: impostare il controllo da creare per il trascinamento dalla finestra Origini dati.
Creazione del form con associazione a dati
È possibile creare i controlli con associazione a dati mediante il trascinamento degli elementi dalla finestra Origini dati al form.
Per creare controlli con associazione a dati nel form
Trascinare il nodo Customers principale dalla finestra Origini dati in Form1.
Nel form vengono visualizzati i controlli con associazione a dati con etichette descrittive e un controllo Toolstrip (BindingNavigator) per lo spostamento all'interno dei record. Sulla barra dei componenti vengono visualizzati gli oggetti NorthwindDataSet, CustomersTableAdapter BindingSource e BindingNavigator.
Trascinare il nodo Orders correlato dalla finestra Origini dati in Form1.
Nota
Il nodo Orders correlato si trova al di sotto della colonna Fax ed è un nodo figlio del nodo Customers.
Sul form vengono visualizzati un controllo DataGridView e un controllo Toolstrip (BindingNavigator) per lo spostamento all'interno dei record. Sulla barra dei componenti vengono visualizzati gli oggetti OrdersTableAdapter e BindingSource.
Aggiunta di codice per aggiornare il database
Aggiornare il database chiamando i metodi Update degli oggetti TableAdapter di Customers e Orders. Per impostazione predefinita, al codice del form viene aggiunto un gestore eventi per il pulsante Salva del controllo BindingNavigator che consente di inviare gli aggiornamenti al database. In questa procedura il codice viene modificato in modo da inviare gli aggiornamenti nell'ordine appropriato e scongiurare il rischio di errori di integrità referenziale. Il codice consente anche di implementare la gestione degli errori eseguendo il wrapping della chiamata di aggiornamento in un blocco try-catch. È possibile modificare il codice in modo da soddisfare i requisiti dell'applicazione.
Nota
Per maggiore chiarezza, in questa procedura dettagliata non viene usata alcuna transazione, ma si tenga presente che se è in corso l'aggiornamento di due o più tabelle correlate, è opportuno 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 aggiungere la logica di aggiornamento all'applicazione
Fare doppio clic sul pulsante Salva del controllo BindingNavigator per aprire l'editor di codice nel gestore eventi bindingNavigatorSaveItem_Click.
Sostituire il codice del gestore eventi in modo da chiamare i metodi Update degli oggetti TableAdapter correlati. Con il codice che segue vengono innanzitutto create tre tabelle di dati temporanei in cui inserire le informazioni aggiornate per ciascuna enumerazione DataRowState (Deleted, Added e Modified). Vengono quindi eseguiti gli aggiornamenti in base all'ordine appropriato. Il codice dovrebbe essere analogo al seguente:
Me.Validate() Me.OrdersBindingSource.EndEdit() Me.CustomersBindingSource.EndEdit() Dim deletedOrders As NorthwindDataSet.OrdersDataTable = CType( NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Deleted), NorthwindDataSet.OrdersDataTable) Dim newOrders As NorthwindDataSet.OrdersDataTable = CType( NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Added), NorthwindDataSet.OrdersDataTable) Dim modifiedOrders As NorthwindDataSet.OrdersDataTable = CType( NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Modified), NorthwindDataSet.OrdersDataTable) Try ' Remove all deleted orders from the Orders table. If Not deletedOrders Is Nothing Then OrdersTableAdapter.Update(deletedOrders) End If ' Update the Customers table. CustomersTableAdapter.Update(NorthwindDataSet.Customers) ' Add new orders to the Orders table. If Not newOrders Is Nothing Then OrdersTableAdapter.Update(newOrders) End If ' Update all modified Orders. If Not modifiedOrders Is Nothing Then OrdersTableAdapter.Update(modifiedOrders) End If NorthwindDataSet.AcceptChanges() Catch ex As Exception MsgBox("Update failed") Finally If Not deletedOrders Is Nothing Then deletedOrders.Dispose() End If If Not newOrders Is Nothing Then newOrders.Dispose() End If If Not modifiedOrders Is Nothing Then modifiedOrders.Dispose() End If End Try
this.Validate(); this.ordersBindingSource.EndEdit(); this.customersBindingSource.EndEdit(); NorthwindDataSet.OrdersDataTable deletedOrders = (NorthwindDataSet.OrdersDataTable) northwindDataSet.Orders.GetChanges(DataRowState.Deleted); NorthwindDataSet.OrdersDataTable newOrders = (NorthwindDataSet.OrdersDataTable) northwindDataSet.Orders.GetChanges(DataRowState.Added); NorthwindDataSet.OrdersDataTable modifiedOrders = (NorthwindDataSet.OrdersDataTable) northwindDataSet.Orders.GetChanges(DataRowState.Modified); try { // Remove all deleted orders from the Orders table. if (deletedOrders != null) { ordersTableAdapter.Update(deletedOrders); } // Update the Customers table. customersTableAdapter.Update(northwindDataSet.Customers); // Add new orders to the Orders table. if (newOrders != null) { ordersTableAdapter.Update(newOrders); } // Update all modified Orders. if (modifiedOrders != null) { ordersTableAdapter.Update(modifiedOrders); } northwindDataSet.AcceptChanges(); } catch (System.Exception ex) { MessageBox.Show("Update failed"); } finally { if (deletedOrders != null) { deletedOrders.Dispose(); } if (newOrders != null) { newOrders.Dispose(); } if (modifiedOrders != null) { modifiedOrders.Dispose(); } }
Verifica dell'applicazione
Per eseguire il test dell'applicazione
Premere F5.
Apportare alcune modifiche ai dati di uno o più record di ogni tabella.
Scegliere il pulsante Salva.
Controllare i valori presenti nel database per verificare che le modifiche siano state salvate.
Nota
Per visualizzare il codice di esempio in cui viene illustrato come aggiornare l'elenco degli ordini quando si modificano i clienti o si aggiungono nuovi dati su ordini e clienti, vedere Procedura: inserire nuovi record in un database e Procedura dettagliata: salvataggio dei dati dalle tabelle dati correlate (aggiornamento gerarchico).
Passaggi successivi
A seconda dei requisiti dell'applicazione, si potranno eseguire diverse operazioni una volta terminata la creazione di un form associato a dati nell'applicazione Windows. È possibile apportare alcuni miglioramenti a questa procedura dettagliata, tra cui:
Aggiunta di una funzionalità di ricerca al form. Per ulteriori informazioni, vedere Procedura: aggiungere una query con parametri a un'applicazione Windows Form.
Modifica dell'origine dati per aggiungere o rimuovere oggetti di database. Per ulteriori informazioni, vedere Procedura: modificare un dataset.
Vedere anche
Concetti
Novità dello sviluppo di applicazioni di dati
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
Cenni preliminari sulle applicazioni dati in Visual Studio
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 |
---|---|---|
Maggio 2011 |
Aggiunti collegamenti agli esempi di codice aggiuntivi. |
Commenti e suggerimenti dei clienti. |