Názorný postup: Zpracování výjimek souběžnosti
Souběžnost výjimky (DBConcurrencyException) jsou aktivována při pokusu o dva uživatelé současně změnit stejná data v databázi.V tomto návodu vytvořit aplikace systému Windows, který znázorňuje lov DBConcurrencyException, locating řádek, který způsobil chybu a jeden strategii lze použít pro jeho zpracování.
Tento názorný postup vás provede následující proces:
Vytvoření nového Aplikace systému Windows projektu.
Vytvořit nový objekt dataset Northwind na základě Customers tabulky.
Vytvoření formuláře s DataGridView k zobrazení dat.
Vyplnění objektu dataset s daty z Customers tabulky v databázi Northwind.
Po vyplnění objektu dataset, použít Vizuální databázové nástroje v aplikaci Visual Studio k přímému přístupu k Customers data tabulky a Změna záznamu.
Klepněte na formulář stejný záznam změnit na jinou hodnotu, aktualizovat objekt dataset a pokus o zápis změn do databáze, která způsobí závažné chybě souběžnosti.
Zachytit chybu a zobrazit různé verze záznamu, což umožňuje uživateli určit, zda chcete pokračovat a aktualizovat databázi nebo zrušit aktualizaci.
Požadavky
K dokončení tohoto návodu budete potřebovat:
- Přístup k ukázkové databázi Northwind oprávnění provádět aktualizace.Další informace naleznete v tématu Jak: Instalace ukázkové databáze.
[!POZNÁMKA]
Dialogová okna a příkazy v nabídkách menu, které vidíte, se mohou lišit od těch popsaných v nápovědě, v závislosti na vašich aktivních nastaveních nebo edici.Chcete-li změnit nastavení, zvolte Import and Export Settings v menu Nástroje.Další informace naleznete v tématu Nastavení aplikace Visual Studio.
Vytvoření nového projektu
Nejprve vaše názorný postup vytváření nové aplikace systému Windows.
Vytvořit nový projekt aplikace systému Windows
Z soubor nabídka, vytvoření nového projektu.
Vyberte programovací jazyk v Typy projektů podokně.
Vyberte Aplikace systému Windows v šablony podokně.
Název projektu ConcurrencyWalkthrougha klepněte na tlačítko OK.
Visual Studio přidá do projektu Aplikaci Solution Explorer a nový formulář zobrazí v návrháři.
Vytváření objektu Northwind Dataset
V této části vytvoříte dataset s názvem NorthwindDataSet.
Vytvořit NorthwindDataSet
Z Data nabídce zvolte přidejte nový datový zdroj.
Průvodce konfigurací zdroje dat Otevře.
Vyberte databáze na Vyberte typ zdroje dat stránku.
Vyberte připojení k ukázkové databázi Northwind ze seznamu dostupných připojení nebo klepněte na tlačítko Nové připojení Pokud připojení není k dispozici v seznamu připojení.
[!POZNÁMKA]
Pokud se připojujete k místní databázový soubor, vyberte Č na dotaz, pokud byste chtěli přidat soubor do projektu.
Klepněte na tlačítko Další na Uložit připojovací řetězec do konfiguračního souboru aplikace stránku.
Rozbalte tabulek uzlu a vyberte Customers tabulky.Výchozí název objektu dataset by měla být NorthwindDataSet.
Klepněte na tlačítko Dokončit do projektu přidat objekt dataset.
Vytvoření ovládacího prvku DataGridView vázán na Data
V této části vytvoříte DataGridView přetažením Zákazníci zboží z Zdroje dat okna, do formuláře systému Windows.
Vytvoření ovládacího prvku DataGridView, který je vázán na tabulce Zákazníci
Z Data nabídce zvolte Zobrazit zdroje dat otevřete Okno zdroje dat.
Z Zdroje dat okno rozšířit NorthwindDataSet uzlu a vyberte Zákazníci tabulky.
Klepněte na šipku dolů na uzel tabulky a vyberte DataGridView z rozevíracího seznamu.
Přetáhněte tabulku na prázdnou oblast formuláře.
A DataGridView ovládací prvek s názvem CustomersDataGridView a BindingNavigator s názvem CustomersBindingNavigator jsou přidány do formulář vázaný na BindingSource zase vázán na Customers v tabulce NorthwindDataSet.
Checkpoint
Nyní můžete vyzkoušet formuláře, ujistěte se, že se chová podle očekávání až do tohoto okamžiku.
K testování formuláře
Stisknutím klávesy F5 pro spuštění aplikace
Zobrazí se formulář s DataGridView řízení na něm, který je vyplněn data z Customers tabulky.
Z ladění nabídce zvolte Zastavit ladění.
Zpracování chyb souběžnosti
Způsob zpracování chyb je závislá na konkrétní obchodní pravidla, která řídí vaše aplikace.Pro tento postup po vznesena narušení souběžného zpracování následující strategie pro zpracování chyby souběžnosti bude použit jako ilustraci:
Aplikace bude prezentovat tři verze záznamu:
Aktuální záznam v databázi.
Do objektu dataset načten původní záznam.
Navrhované změny v objektu dataset.
Uživatel je pak možné přepsat navrhovaná verze databáze nebo zrušit aktualizaci a aktualizaci objektu dataset novými hodnotami z databáze.
Povolení zpracování chyb souběžnosti
Vytvořte vlastní chyba zpracování.
Zobrazit možnosti pro uživatele.
Zpracovat odpověď uživatele.
Znovu odeslat aktualizaci nebo obnovení dat v objektu dataset.
Přidání kódu výjimku souběžného zpracování
Při pokusu provést aktualizaci a získá aktivovaná výjimku, obecně chcete něco udělat s informací poskytnutých zvýšené výjimku.
V této části můžete přidat kód, který se pokusí aktualizovat databázi a zpracovat všechny DBConcurrencyException , může získat aktivována, jakož i jiné výjimky.
[!POZNÁMKA]
CreateMessage a ProcessDialogResults metody budou přidány později v tomto návodu.
Přidání chyby souběžného zpracování chyb
Přidejte následující kód Form1_Load metoda:
Private Sub UpdateDatabase() Try Me.CustomersTableAdapter.Update(Me.NorthwindDataSet.Customers) MsgBox("Update successful") Catch dbcx As Data.DBConcurrencyException Dim response As Windows.Forms.DialogResult response = MessageBox.Show(CreateMessage(CType(dbcx.Row, NorthwindDataSet.CustomersRow)), "Concurrency Exception", MessageBoxButtons.YesNo) ProcessDialogResult(response) Catch ex As Exception MsgBox("An error was thrown while attempting to update the database.") End Try End Sub
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."); } }
Nahradit CustomersBindingNavigatorSaveItem_Click volání metody UpdateDatabase metoda tak vypadá následující:
Private Sub CustomersBindingNavigatorSaveItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CustomersBindingNavigatorSaveItem.Click UpdateDatabase() End Sub
private void customersBindingNavigatorSaveItem_Click(object sender, EventArgs e) { UpdateDatabase(); }
Zobrazení voleb pro uživatele
Kód, který jste právě napsali volání CreateMessage postup uživateli zobrazit informace o chybě.Pro tento postup použijete zprávou uživateli zobrazit různé verze záznamu a umožní uživateli zvolit, zda chcete přepsat změny záznamu nebo zrušit úpravy.Jakmile uživatel vybere možnost (klepne na tlačítko) v okně zprávy, je předána odpověď ProcessDialogResult metoda.
Vytvořit zprávu zobrazit uživateli
Vytvořit zprávu přidáním následujícího kódu Editor kódu.Zadání tohoto kódu níže UpdateDatabase metoda.
Private Function CreateMessage(ByVal cr As NorthwindDataSet.CustomersRow) As String Return "Database: " & GetRowData(GetCurrentRowInDB(cr), Data.DataRowVersion.Default) & vbCrLf & "Original: " & GetRowData(cr, Data.DataRowVersion.Original) & vbCrLf & "Proposed: " & GetRowData(cr, Data.DataRowVersion.Current) & vbCrLf & "Do you still want to update the database with the proposed value?" End Function '-------------------------------------------------------------------------- ' 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 TempCustomersDataTable As New NorthwindDataSet.CustomersDataTable Private Function GetCurrentRowInDB( ByVal RowWithError As NorthwindDataSet.CustomersRow ) As NorthwindDataSet.CustomersRow Me.CustomersTableAdapter.Fill(TempCustomersDataTable) Dim currentRowInDb As NorthwindDataSet.CustomersRow = TempCustomersDataTable.FindByCustomerID(RowWithError.CustomerID) Return currentRowInDb End Function '-------------------------------------------------------------------------- ' This method takes a CustomersRow and RowVersion ' and returns a string of column values to display to the user. '-------------------------------------------------------------------------- Private Function GetRowData(ByVal custRow As NorthwindDataSet.CustomersRow, ByVal RowVersion As Data.DataRowVersion) As String Dim rowData As String = "" For i As Integer = 0 To custRow.ItemArray.Length - 1 rowData &= custRow.Item(i, RowVersion).ToString() & " " Next Return rowData End Function
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; }
Zpracování odpovědí uživatele
Budete také potřebovat kód zpracovat odpověď uživatele do pole zpráva.Možnosti jsou k navrhované změně přepsat aktuální záznam v databázi nebo opustit místní změny a aktualizovat tabulku dat se záznamem v databázi.Pokud ano, uživatel Merge metoda je volána s preserveChanges argument nastaven na hodnotu true.To způsobí pokus o aktualizaci být úspěšný, protože původní verzi záznamu nyní odpovídá záznamu v databázi.
Uživatel proces vstup z okna se zprávou
Přidejte následující kód pod kódem přidaným v předchozí části.
' 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 Sub ProcessDialogResult(ByVal response As Windows.Forms.DialogResult) Select Case response Case Windows.Forms.DialogResult.Yes NorthwindDataSet.Customers.Merge(TempCustomersDataTable, True) UpdateDatabase() Case Windows.Forms.DialogResult.No NorthwindDataSet.Customers.Merge(TempCustomersDataTable) MsgBox("Update cancelled") End Select End Sub
// 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; } }
Testování
Nyní můžete vyzkoušet formuláře, ujistěte se, že se chová podle očekávání.Simulovat narušení souběžného zpracování, je nutné změnit data v databázi po vyplnění NorthwindDataSet.
K testování formuláře
Stisknutím klávesy F5 spustíte aplikaci.
Po zobrazení formuláře ji nechat spuštěnou a přepněte do aplikace Visual Studio IDE.
Z zobrazení nabídce zvolte Server Explorer.
V Server Explorer, připojení pomocí aplikace a potom tabulek uzel.
Klepněte pravým tlačítkem myši Zákazníci tabulka a vyberte Zobrazit Data v tabulce.
V prvním záznamu (ALFKI) změnit ContactName na Maria Anders2.
[!POZNÁMKA]
Přejděte do jiného řádku potvrdit změny.
Přepnout ConcurrencyWalkthroughpro spuštění formuláře.
V prvním záznamu ve formuláři (ALFKI), změňte ContactName na Maria Anders1.
Klepněte Uložit tlačítko.
Je aktivována při souběžném a objeví zpráva.
Klepnutím na Č zruší aktualizace a aktualizace objektu dataset s hodnotami v databázi, že klepnutím na Ano navržená hodnota zapíše do databáze.
Viz také
Koncepty
Novinky ve vývoji datových aplikací v sadě Visual Studio 2012
Vazba na Data v aplikaci Visual Studio model Windows Forms prvky
Příprava aplikace pro příjem dat.
Ovládací prvky vazby na Data v aplikaci Visual Studio