Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Annotazioni
La DataSet classe e le classi correlate sono tecnologie .NET Framework legacy dei primi anni '2000 che consentono alle applicazioni di lavorare con i dati in memoria mentre le app vengono disconnesse dal database. Le tecnologie sono particolarmente utili per le app che consentono agli utenti di modificare i dati e rendere persistenti le modifiche apportate al database. Sebbene i set di dati siano una tecnologia di successo comprovata, l'approccio consigliato per le nuove applicazioni .NET consiste nell'usare Entity Framework Core. Entity Framework offre un modo più naturale per usare i dati tabulari come modelli a oggetti e dispone di un'interfaccia di programmazione più semplice.
Le eccezioni di concorrenza (System.Data.DBConcurrencyException) vengono generate quando due utenti tentano di modificare contemporaneamente gli stessi dati in un database. In questa guida si crea un'applicazione Windows che illustra come intercettare un DBConcurrencyException, individuare la riga che ha causato l'errore e apprendere una strategia per gestirlo.
Questa procedura dettagliata illustra il processo seguente:
Creare un nuovo progetto app Windows Forms (.NET Framework).
Creare un nuovo set di dati basato sulla tabella Northwind Customers.
Creare un formulario con un DataGridView per visualizzare i dati.
Compilare un set di dati con i dati della tabella Customers nel database Northwind.
Utilizzare la funzionalità Mostra dati tabella in Esplora server per accedere ai dati della tabella Customers e modificare un record.
Modificare un singolo record in un valore diverso, aggiornare il set di dati e tentare di scrivere le modifiche nel database, il che provoca un errore di concorrenza.
Intercettare l'errore, quindi visualizzare le diverse versioni del record, consentendo all'utente di determinare se continuare e aggiornare il database o annullare l'aggiornamento.
Prerequisiti
Questa procedura dettagliata usa SQL Server Express LocalDB e il database di esempio Northwind.
Se SQL Server Express LocalDB non è disponibile, installarlo dalla pagina di download di SQL Server Express o tramite il programma di installazione di Visual Studio. Nel programma di installazione di Visual Studioè possibile installare SQL Server Express LocalDB come parte del carico di lavoro di archiviazione ed elaborazione dei dati o come singolo componente.
Installare il database di esempio Northwind seguendo questa procedura:
In Visual Studio, aprire la finestra Esplora oggetti di SQL Server. L'Esplora oggetti di SQL Server viene installato come parte del carico di lavoro Archiviazione dati ed elaborazione nel programma di installazione di Visual Studio. Espandere nodo SQL Server. Fare clic con il pulsante destro del mouse sull'istanza di LocalDB e selezionare Nuova query.
Verrà visualizzata una finestra dell'editor di query.
Copia lo script Northwind Transact-SQL negli Appunti. Questo script T-SQL crea il database Northwind da zero e lo popola con i dati.
Incolla lo script T-SQL nell'editor di query e poi scegli il pulsante Esegui.
Dopo un breve periodo di tempo, la query termina l'esecuzione e viene creato il database Northwind.
Creare un nuovo progetto
Per iniziare, creare una nuova applicazione Windows Form:
In Visual Studio scegliere Nuovo> dal menu File.
Espandere Visual C# o Visual Basic nel riquadro a sinistra, quindi selezionare Desktop di Windows.
Nel riquadro centrale selezionare il tipo di progetto App Windows Form .
Assegnare al progetto il nome ConcurrencyWalkthrough e quindi scegliere OK.
Il progetto ConcurrencyWalkthrough viene creato e aggiunto a Esplora soluzioni e viene aperto un nuovo modulo nella finestra di progettazione.
Creare il set di dati Northwind
Creare quindi un set di dati denominato NorthwindDataSet:
Scegliere Aggiungi nuova origine dati dal menu Dati.
Si apre la Configurazione guidata dell'origine dati.
Nella schermata Scegliere un tipo di origine dati selezionare Database.
Selezionare una connessione al database di esempio Northwind dall'elenco delle connessioni disponibili. Se la connessione non è disponibile nell'elenco delle connessioni, selezionare Nuova connessione.
Annotazioni
Se ci si connette a un file di database locale, selezionare No quando viene chiesto se si vuole aggiungere il file al progetto.
Nella schermata Salva stringa di connessione nel file di configurazione dell'applicazione selezionare Avanti.
Espandere il nodo Tabelle e selezionare la tabella Clienti . Il nome predefinito per il set di dati deve essere NorthwindDataSet.
Selezionare Fine per aggiungere il set di dati al progetto.
Creare un controllo DataGridView associato a dati
In questa sezione viene creato un System.Windows.Forms.DataGridView oggetto trascinando l'elemento Customers dalla finestra Origini dati nel Windows Form.
Per aprire la finestra Origini dati, scegliere Mostra origini dati dal menu Dati.
Nella finestra Origini dati espandere il nodo NorthwindDataSet e quindi selezionare la tabella Customers .
Selezionare la freccia giù nel nodo della tabella e quindi selezionare DataGridView nell'elenco a discesa.
Trascinare la tabella in un'area vuota del modulo.
Un DataGridView controllo denominato CustomersDataGridView e un BindingNavigator denominato CustomersBindingNavigator vengono aggiunti al form, che è associato a BindingSource. Questo è, a sua volta, associato alla tabella Customers in NorthwindDataSet.
Testare il modulo
È ora possibile testare il modulo per assicurarsi che si comporti come previsto fino a questo punto:
Selezionare F5 per eseguire l'applicazione.
Il modulo viene visualizzato con un DataGridView controllo su di esso compilato con i dati della tabella Customers.
Scegliere Arresta debug dal menu Debug.
Gestire gli errori di concorrenza
La modalità di gestione degli errori dipende dalle regole business specifiche che regolano l'applicazione. Per questa procedura dettagliata, viene utilizzata la seguente strategia come esempio per gestire l'errore di concorrenza.
L'applicazione presenta all'utente tre versioni del record:
Record attuale nel database
Record originale caricato nel set di dati
Modifiche proposte nel set di dati
L'utente può quindi sovrascrivere il database con la versione proposta oppure annullare l'aggiornamento e aggiornare il set di dati con i nuovi valori del database.
Per abilitare la gestione degli errori di concorrenza
Creare un gestore degli errori personalizzato.
Consente di visualizzare le scelte per l'utente.
Elaborare la risposta dell'utente.
Inviare nuovamente l'aggiornamento o reimpostare i dati nel set di dati.
Aggiungere codice per gestire l'eccezione di concorrenza
Quando si tenta di eseguire un aggiornamento e viene generata un'eccezione, in genere si vuole eseguire un'operazione con le informazioni fornite dall'eccezione generata. In questa sezione viene aggiunto codice che tenta di aggiornare il database. Gestisci anche qualsiasi DBConcurrencyException che potrebbe sorgere, oltre a tutte le altre eccezioni.
Annotazioni
I metodi CreateMessage e ProcessDialogResults vengono aggiunti più avanti nella procedura guidata.
Aggiungere il codice seguente sotto il
Form1_Loadmetodo :private void UpdateDatabase() { try { this.customersTableAdapter.Update(this.northwindDataSet.Customers); MessageBox.Show("Update successful"); } catch (DBConcurrencyException dbcx) { DialogResult response = MessageBox.Show(CreateMessage((NorthwindDataSet.CustomersRow) (dbcx.Row)), "Concurrency Exception", MessageBoxButtons.YesNo); ProcessDialogResult(response); } catch (Exception ex) { MessageBox.Show("An error was thrown while attempting to update the database."); } }
Sostituire il
CustomersBindingNavigatorSaveItem_Clickmetodo per chiamare ilUpdateDatabasemetodo in modo che abbia un aspetto simile al seguente:
Visualizzare le scelte per l'utente
Il codice appena scritto chiama la CreateMessage procedura per visualizzare le informazioni sull'errore all'utente. Per questa procedura dettagliata, si usa una finestra di messaggio per visualizzare le diverse versioni del record all'utente. In questo modo l'utente può scegliere se sovrascrivere il record con le modifiche o annullare la modifica. Quando l'utente seleziona un'opzione (fa clic su un pulsante) nella finestra di messaggio, la risposta viene passata al ProcessDialogResult metodo .
Creare il messaggio aggiungendo il codice seguente all'editor di codice. Immettere questo codice sotto il UpdateDatabase metodo :
private string CreateMessage(NorthwindDataSet.CustomersRow cr)
{
return
"Database: " + GetRowData(GetCurrentRowInDB(cr), DataRowVersion.Default) + "\n" +
"Original: " + GetRowData(cr, DataRowVersion.Original) + "\n" +
"Proposed: " + GetRowData(cr, DataRowVersion.Current) + "\n" +
"Do you still want to update the database with the proposed value?";
}
//--------------------------------------------------------------------------
// This method loads a temporary table with current records from the database
// and returns the current values from the row that caused the exception.
//--------------------------------------------------------------------------
private NorthwindDataSet.CustomersDataTable tempCustomersDataTable =
new NorthwindDataSet.CustomersDataTable();
private NorthwindDataSet.CustomersRow GetCurrentRowInDB(NorthwindDataSet.CustomersRow RowWithError)
{
this.customersTableAdapter.Fill(tempCustomersDataTable);
NorthwindDataSet.CustomersRow currentRowInDb =
tempCustomersDataTable.FindByCustomerID(RowWithError.CustomerID);
return currentRowInDb;
}
//--------------------------------------------------------------------------
// This method takes a CustomersRow and RowVersion
// and returns a string of column values to display to the user.
//--------------------------------------------------------------------------
private string GetRowData(NorthwindDataSet.CustomersRow custRow, DataRowVersion RowVersion)
{
string rowData = "";
for (int i = 0; i < custRow.ItemArray.Length ; i++ )
{
rowData = rowData + custRow[i, RowVersion].ToString() + " ";
}
return rowData;
}
Elaborare la risposta dell'utente
È anche necessario codice per elaborare la risposta dell'utente alla finestra di messaggio. Le opzioni consentono di sovrascrivere il record corrente nel database con la modifica proposta oppure di abbandonare le modifiche locali e aggiornare la tabella dati con il record attualmente presente nel database. Se l'utente sceglie Sì, il Merge metodo viene chiamato con l'argomento preserveChanges impostato su true. In questo modo il tentativo di aggiornamento ha esito positivo, perché la versione originale del record corrisponde ora al record nel database.
Aggiungere il codice seguente sotto il codice aggiunto nella sezione precedente:
// This method takes the DialogResult selected by the user and updates the database
// with the new values or cancels the update and resets the Customers table
// (in the dataset) with the values currently in the database.
private void ProcessDialogResult(DialogResult response)
{
switch (response)
{
case DialogResult.Yes:
northwindDataSet.Merge(tempCustomersDataTable, true, MissingSchemaAction.Ignore);
UpdateDatabase();
break;
case DialogResult.No:
northwindDataSet.Merge(tempCustomersDataTable);
MessageBox.Show("Update cancelled");
break;
}
}
Testare il comportamento del modulo
È ora possibile testare il modulo per assicurarsi che si comporti come previsto. Per simulare una violazione della concorrenza, modificare i dati nel database dopo aver compilato NorthwindDataSet.
Selezionare F5 per eseguire l'applicazione.
Dopo aver visualizzato il modulo, lasciarlo in esecuzione e passare all'IDE di Visual Studio.
Scegliere Esplora server dal menu Visualizza.
In Esplora server espandere la connessione usata dall'applicazione e quindi espandere il nodo Tabelle .
Fare clic con il pulsante destro del mouse sulla tabella Customers e quindi scegliere Mostra dati tabella.
Nel primo record (ALFKI) modificare ContactName in Maria Anders2.
Annotazioni
Passare a una riga diversa per confermare la modifica.
Passare all'interfaccia attiva di ConcurrencyWalkthrough.
Nel primo record nel modulo (ALFKI), modificare ContactName in Maria Anders1.
Selezionare il pulsante Salva.
Viene generato l'errore di concorrenza e viene visualizzata la finestra di messaggio.
Selezionando No annulla l'aggiornamento e aggiorna il set di dati con i valori attualmente presenti nel database. Se si seleziona Sì , il valore proposto viene scritto nel database.