Procedura dettagliata: salvataggio di dati in un database (a più tabelle)

Aggiornamento: novembre 2007

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:

Le finestre di dialogo e i comandi di menu visualizzati potrebbero non corrispondere a quelli descritti nella Guida in linea in quanto dipendono dall'edizione o dalle impostazioni in uso. Per modificare le impostazioni, scegliere Importa/Esporta impostazioni dal menu Strumenti. Per ulteriori informazioni, vedere Impostazioni di Visual Studio.

Di seguito sono elencate le attività illustrate nella procedura dettagliata:

Prerequisiti

Per completare questa procedura dettagliata è necessario:

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

  1. Scegliere il comando per la creazione di un nuovo progetto dal menu File.

  2. Assegnare al progetto il nome UpdateMultipleTablesWalkthrough.

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

  1. Scegliere Mostra origini dati dal menu Dati.

  2. Nella finestra Origini dati scegliere Aggiungi nuova origine dati per avviare la Configurazione guidata origine dati.

  3. Selezionare Database nella pagina Seleziona un tipo di origine dati, quindi scegliere Avanti.

  4. 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).

  5. Se il database in uso richiede una password, selezionare l'opzione che consente di includere dati riservati, quindi scegliere Avanti.

  6. Scegliere Avanti nella pagina Salva la stringa di connessione nel file di configurazione dell'applicazione.

  7. Espandere il nodo Tabelle nella pagina Seleziona oggetti di database.

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

  1. Espandere il nodo Customers nella finestra Origini dati.

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

  1. 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, CustomersTableAdapterBindingSource e BindingNavigator.

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

  1. Fare doppio clic sul pulsante Salva del controllo BindingNavigator per aprire l'editor di codice nel gestore eventi bindingNavigatorSaveItem_Click.

  2. 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();
        }
    }
    

Test dell'applicazione

Per eseguire il test dell'applicazione

  1. Premere F5.

  2. Apportare alcune modifiche ai dati di uno o più record di ogni tabella.

  3. Scegliere il pulsante Salva.

  4. Controllare i valori presenti nel database per verificare che le modifiche siano state salvate.

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:

Vedere anche

Concetti

Novità relative ai dati

Cenni preliminari sulla visualizzazione dei dati

Altre risorse

Procedure dettagliate relative ai dati

Guida introduttiva all'accesso 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

Modifica di dati nell'applicazione

Convalida dei dati

Salvataggio di dati