Sdílet prostřednictvím


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:

  1. Vytvoření nového Aplikace systému Windows projektu.

  2. Vytvořit nový objekt dataset Northwind na základě Customers tabulky.

  3. Vytvoření formuláře s DataGridView k zobrazení dat.

  4. Vyplnění objektu dataset s daty z Customers tabulky v databázi Northwind.

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

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

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

[!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

  1. Z soubor nabídka, vytvoření nového projektu.

  2. Vyberte programovací jazyk v Typy projektů podokně.

  3. Vyberte Aplikace systému Windows v šablony podokně.

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

  1. Z Data nabídce zvolte přidejte nový datový zdroj.

    Průvodce konfigurací zdroje dat Otevře.

  2. Vyberte databáze na Vyberte typ zdroje dat stránku.

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

  4. Klepněte na tlačítko Další na Uložit připojovací řetězec do konfiguračního souboru aplikace stránku.

  5. Rozbalte tabulek uzlu a vyberte Customers tabulky.Výchozí název objektu dataset by měla být NorthwindDataSet.

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

  1. Z Data nabídce zvolte Zobrazit zdroje dat otevřete Okno zdroje dat.

  2. Z Zdroje dat okno rozšířit NorthwindDataSet uzlu a vyberte Zákazníci tabulky.

  3. Klepněte na šipku dolů na uzel tabulky a vyberte DataGridView z rozevíracího seznamu.

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

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

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

  1. Vytvořte vlastní chyba zpracování.

  2. Zobrazit možnosti pro uživatele.

  3. Zpracovat odpověď uživatele.

  4. Znovu odeslat aktualizaci nebo obnovení dat v objektu dataset.

ms171936.collapse_all(cs-cz,VS.110).gifPř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

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

ms171936.collapse_all(cs-cz,VS.110).gifZobrazení 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;
    }
    

ms171936.collapse_all(cs-cz,VS.110).gifZpracová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

  1. Stisknutím klávesy F5 spustíte aplikaci.

  2. Po zobrazení formuláře ji nechat spuštěnou a přepněte do aplikace Visual Studio IDE.

  3. Z zobrazení nabídce zvolte Server Explorer.

  4. V Server Explorer, připojení pomocí aplikace a potom tabulek uzel.

  5. Klepněte pravým tlačítkem myši Zákazníci tabulka a vyberte Zobrazit Data v tabulce.

  6. V prvním záznamu (ALFKI) změnit ContactName na Maria Anders2.

    [!POZNÁMKA]

    Přejděte do jiného řádku potvrdit změny.

  7. Přepnout ConcurrencyWalkthroughpro spuštění formuláře.

  8. V prvním záznamu ve formuláři (ALFKI), změňte ContactName na Maria Anders1.

  9. Klepněte Uložit tlačítko.

    Je aktivována při souběžném a objeví zpráva.

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

Načítání dat do aplikace

Ovládací prvky vazby na Data v aplikaci Visual Studio

Data v aplikaci pro úpravy

Ověření dat

Ukládání dat

Další zdroje

Data návody

Připojení k datům v aplikaci Visual Studio