Procedura dettagliata: salvataggio di dati in una transazione

 

Data di pubblicazione: aprile 2016

Questa procedura dettagliata illustra come salvare dati in una transazione usando lo spazio dei nomi System.Transactions. Questo esempio usa le tabelle Customers e Orders del database di esempio Northwind.

Prerequisiti

La procedura dettagliata richiede 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 il nuovo progetto Windows

  1. In Visual Studio creare un nuovo Progetto dal menu File.

  2. Assegnare al progetto il nome SavingDataInATransactionWalkthrough.

  3. Selezionare Applicazione Windows e fare clic su OK. Per altre informazioni, vedere Applicazioni client.

    Il progetto SavingDataInATransactionWalkthrough viene creato e aggiunto a Esplora soluzioni.

Creazione di un'origine dati del database

In questo passaggio viene usata 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 eseguire una delle operazioni seguenti:

    • Selezionare la connessione dati al database di esempio Northwind nell'elenco a discesa, se presente.

      -oppure-

    • Selezionare Nuova connessione per avviare la finestra di dialogo Aggiungi/Modifica connessione e creare una connessione al database Northwind.

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

  6. Nella pagina Salva stringa di connessione nel file di configurazione dell'applicazione fare clic su Avanti.

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

  8. Selezionare le tabelle Customers e Orders, quindi fare clic su 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 associati a dati trascinando elementi dalla finestra Origini dati nel form.

Per creare controlli associati a dati nel Windows Form

  • Espandere il nodo Customers nella finestra Origini dati.

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

    Nel 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 della 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. Nella barra dei componenti vengono visualizzati gli oggetti OrdersTableAdapter e BindingSource.

Aggiunta di un riferimento all'assembly System.Transactions

Le transazioni usano lo spazio dei nomi System.Transactions. Un riferimento di progetto all'assembly system.transactions non viene aggiunto per impostazione predefinita. Pertanto, è necessario aggiungerlo manualmente.

Per aggiungere un riferimento al file DLL System.Transactions.

  1. Dal menu Progetto scegliere Aggiungi riferimento.

  2. Selezionare System.Transactions (nella scheda .NET) e fare clic su 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 nel 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 eventi Click 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 una 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 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();
                }
            }
    
        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
    

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 seguente in Form1:

            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");
                    }
                }
            }
    
        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
    

Per eliminare i clienti esistenti

  • Aggiungere il metodo DeleteCustomers seguente in Form1:

            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");
                    }
                }
            }
    
        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
    

Per aggiungere nuovi clienti

  • Aggiungere il metodo AddNewCustomers seguente in Form1:

            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");
                    }
                }
            }
    
        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
    

Per aggiungere nuovi ordini

  • Aggiungere il metodo AddNewOrders seguente in Form1:

            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");
                    }
                }
            }
    
        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
    

Esecuzione dell'applicazione

Per eseguire l'applicazione

  • Premere F5 per eseguire l'applicazione.

Vedere anche

Transazioni e concorrenza
Transazioni distribuite Oracle
Procedura: salvare dati utilizzando una transazione
Integrazione di System.Transactions con SQL Server
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