Procedura dettagliata: salvataggio di dati in una transazione

In questa procedura dettagliata viene illustrato come salvare dati in una transazione utilizzando lo spazio dei nomi System.Transactions. In questo esempio vengono utilizzate le tabelle Customerse Orders del database di esempio Northwind.

Prerequisiti

Per la procedura dettagliata è richiesto l'accesso al database di esempio Northwind. Per informazioni sull'impostazione del database di esempio Northwind, vedere Procedura: installare database di esempio.

Creazione di un'applicazione Windows

Il primo passaggio consiste nella creazione di un'Applicazione Windows.

Per creare un nuovo progetto Windows

  1. In Visual Studio scegliere Progetto dal menu File.

  2. Denominare il progetto SavingDataInATransactionWalkthrough.

  3. Selezionare Applicazione Windows e scegliere OK. Per ulteriori informazioni, vedere Creazione di applicazioni per Windows.

    Il progetto SavingDataInATransactionWalkthrough viene creato e aggiunto a Esplora soluzioni.

Creazione di un'origine dati per il database

In questo passaggio viene utilizzata la Configurazione guidata origine dati per creare un'origine dati basata sulle tabelle Customers e Orders del database di esempio Northwind.

Per creare l'origine dati

  1. Scegliere Mostra origini dati dal menu Dati.

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

  3. Selezionare Database nella pagina Scegliere un tipo di origine dati e 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 avviare la casella di dialogo Aggiungi/Modifica connessione e creare una connessione al database Northwind. 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 e fare clic su 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 e scegliere Fine.

    L'oggetto NorthwindDataSet viene aggiunto al progetto e le tabelle Customers e Orders vengono visualizzate nella finestra Origini dati.

Aggiunta di controlli al form

È 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 Windows Form

  • Espandere il nodo Customers nella finestra Origini dati.

  • Trascinare il nodo Customers principale dalla finestra Origini dati a Form1.

    Sul form vengono visualizzati un controllo DataGridView e un controllo Toolstrip (BindingNavigator) per lo spostamento all'interno dei record. Nella barra dei componenti vengono visualizzati gli oggetti NorthwindDataSet, CustomersTableAdapter BindingSource e BindingNavigator.

  • Trascinare il nodo Orders correlato (il nodo tabella figlio correlato al di sotto della colonna Fax, non il nodo Orders principale) nel form sotto l'oggetto CustomersDataGridView.

    Nel form verrà visualizzato un oggetto DataGridView.. Sulla barra dei componenti vengono visualizzati gli oggetti OrdersTableAdapter e BindingSource.

Aggiunta di un riferimento all'assembly System.Transactions

Nelle transazioni si utilizza lo spazio dei nomi System.Transactions. Un riferimento di progetto all'assembly system.transactions non è aggiunto per impostazione predefinita; è necessario aggiungerlo manualmente.

Per aggiungere un riferimento al file DDl System.Transactions.

  1. Scegliere Aggiungi riferimento dal menu Progetto.

  2. Selezionare System.Transactions (nella scheda .NET) e scegliere OK.

    Al progetto viene aggiunto un riferimento a System.Transactions.

Modifica del codice nel pulsante SaveItem di BindingNavigator.

Per impostazione predefinita, per la prima tabella rilasciata sul form, viene aggiunto il codice all'evento click del pulsante di salvataggio nell'oggetto BindingNavigator. È necessario aggiungere manualmente il codice per aggiornare eventuali tabelle aggiuntive. Per questa procedura dettagliata, è stato effettuato il refactoring del codice di salvataggio del gestore dell'evento clic del pulsante di salvataggio e sono stati creati altri metodi per fornire una funzionalità di aggiornamento specifica a seconda dell'esigenza di eliminare o aggiungere un'eventuale riga.

Per modificare il codice di salvataggio autogenerato

  1. Fare doppio clic sul pulsante Salva nell'oggetto CustomersBindingNavigator (il pulsante con l'icona del disco floppy).

  2. Sostituire il metodo CustomersBindingNavigatorSaveItem_Click con il codice seguente:

    Private Sub CustomersBindingNavigatorSaveItem_Click() Handles CustomersBindingNavigatorSaveItem.Click
        UpdateData()
    End Sub
    
    Private Sub UpdateData()
        Me.Validate()
        Me.CustomersBindingSource.EndEdit()
        Me.OrdersBindingSource.EndEdit()
    
        Using updateTransaction As New Transactions.TransactionScope
    
            DeleteOrders()
            DeleteCustomers()
            AddNewCustomers()
            AddNewOrders()
    
            updateTransaction.Complete()
            NorthwindDataSet.AcceptChanges()
        End Using
    End Sub
    
    private void customersBindingNavigatorSaveItem_Click(object sender, EventArgs e)
    {
        UpdateData();
    }
    
    private void UpdateData()
    {
        this.Validate();
        this.customersBindingSource.EndEdit();
        this.ordersBindingSource.EndEdit();
    
        using (System.Transactions.TransactionScope updateTransaction = 
            new System.Transactions.TransactionScope())
        {
            DeleteOrders();
            DeleteCustomers();
            AddNewCustomers();
            AddNewOrders();
    
            updateTransaction.Complete();
            northwindDataSet.AcceptChanges();
        }
    }
    

L'ordine di riconciliazione delle modifiche ai dati correlati è il seguente:

  • Eliminare i record figlio (in questo caso, eliminare i record dalla tabella Orders)

  • Eliminare i record padre (in questo caso, eliminare i record dalla tabella Customers)

  • Inserire i record padre (in questo caso, inserire i record nella tabella Customers)

  • Inserire i record figlio (in questo caso, inserire i record nella tabella Orders)

Per eliminare gli ordini esistenti

  • Aggiungere il metodo DeleteOrders riportato di seguito a Form1:

    Private Sub DeleteOrders()
    
        Dim deletedOrders As NorthwindDataSet.OrdersDataTable
        deletedOrders = CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Deleted),
            NorthwindDataSet.OrdersDataTable)
    
        If Not IsNothing(deletedOrders) Then
            Try
                OrdersTableAdapter.Update(deletedOrders)
    
            Catch ex As Exception
                MessageBox.Show("DeleteOrders Failed")
            End Try
        End If
    End Sub
    
    private void DeleteOrders()
    {
        NorthwindDataSet.OrdersDataTable deletedOrders;
        deletedOrders = (NorthwindDataSet.OrdersDataTable)
            northwindDataSet.Orders.GetChanges(DataRowState.Deleted);
    
        if (deletedOrders != null)
        {
            try
            {
                ordersTableAdapter.Update(deletedOrders);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("DeleteOrders Failed");
            }
        }
    }
    

Per eliminare i clienti esistenti

  • Aggiungere il metodo DeleteCustomers riportato di seguito a Form1:

    Private Sub DeleteCustomers()
    
        Dim deletedCustomers As NorthwindDataSet.CustomersDataTable
        deletedCustomers = CType(NorthwindDataSet.Customers.GetChanges(Data.DataRowState.Deleted),
            NorthwindDataSet.CustomersDataTable)
    
        If Not IsNothing(deletedCustomers) Then
            Try
                CustomersTableAdapter.Update(deletedCustomers)
    
            Catch ex As Exception
                MessageBox.Show("DeleteCustomers Failed" & vbCrLf & ex.Message)
            End Try
        End If
    End Sub
    
    private void DeleteCustomers()
    {
        NorthwindDataSet.CustomersDataTable deletedCustomers;
        deletedCustomers = (NorthwindDataSet.CustomersDataTable)
            northwindDataSet.Customers.GetChanges(DataRowState.Deleted);
    
        if (deletedCustomers != null)
        {
            try
            {
                customersTableAdapter.Update(deletedCustomers);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("DeleteCustomers Failed");
            }
        }
    }
    

Per aggiungere nuovi clienti

  • Aggiungere il metodo AddNewCustomers riportato di seguito a Form1:

    Private Sub AddNewCustomers()
    
        Dim newCustomers As NorthwindDataSet.CustomersDataTable
        newCustomers = CType(NorthwindDataSet.Customers.GetChanges(Data.DataRowState.Added),
            NorthwindDataSet.CustomersDataTable)
    
        If Not IsNothing(newCustomers) Then
            Try
                CustomersTableAdapter.Update(newCustomers)
    
            Catch ex As Exception
                MessageBox.Show("AddNewCustomers Failed" & vbCrLf & ex.Message)
            End Try
        End If
    End Sub
    
    private void AddNewCustomers()
    {
        NorthwindDataSet.CustomersDataTable newCustomers;
        newCustomers = (NorthwindDataSet.CustomersDataTable)
            northwindDataSet.Customers.GetChanges(DataRowState.Added);
    
        if (newCustomers != null)
        {
            try
            {
                customersTableAdapter.Update(newCustomers);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("AddNewCustomers Failed");
            }
        }
    }
    

Per aggiungere nuovi ordini

  • Aggiungere il metodo AddNewOrders riportato di seguito a Form1:

    Private Sub AddNewOrders()
    
        Dim newOrders As NorthwindDataSet.OrdersDataTable
        newOrders = CType(NorthwindDataSet.Orders.GetChanges(Data.DataRowState.Added),
            NorthwindDataSet.OrdersDataTable)
    
        If Not IsNothing(newOrders) Then
            Try
                OrdersTableAdapter.Update(newOrders)
    
            Catch ex As Exception
                MessageBox.Show("AddNewOrders Failed" & vbCrLf & ex.Message)
            End Try
        End If
    End Sub
    
    private void AddNewOrders()
    {
        NorthwindDataSet.OrdersDataTable newOrders;
        newOrders = (NorthwindDataSet.OrdersDataTable)
            northwindDataSet.Orders.GetChanges(DataRowState.Added);
    
        if (newOrders != null)
        {
            try
            {
                ordersTableAdapter.Update(newOrders);
            }
            catch (System.Exception ex)
            {
                MessageBox.Show("AddNewOrders Failed");
            }
        }
    }
    

Esecuzione dell'applicazione

Per eseguire l'applicazione

  • Premere F5 per eseguire l'applicazione.

Vedere anche

Attività

Procedura: salvare dati utilizzando una transazione

Concetti

Transazioni distribuite Oracle

Integrazione di System.Transactions con SQL Server (ADO.NET)

Associazione di controlli ai dati in Visual Studio

Altre risorse

Transazioni e concorrenza (ADO.NET)

Connessione ai dati in Visual Studio

Preparazione dell'applicazione al ricevimento di dati

Recupero di dati nell'applicazione

Modifica di dati nell'applicazione

Convalida dei dati

Salvataggio di dati