Udostępnij za pośrednictwem


Wskazówki: obsługa wyjątku współbieżności

Współbieżność wyjątki (DBConcurrencyException) są wywoływane, gdy dwóch użytkowników usiłuje zmienić te same dane w bazie danych w tym samym czasie.W tym instruktażu tworzenie aplikacji systemu Windows, który ilustruje połowu DBConcurrencyException, ustalających wiersz, który spowodował błąd i używać jednej strategii dla Ciebie dotyczące posługiwania się nimi.

Ten instruktaż składa się z następującym procesem:

  1. Utwórz nowy Aplikacji systemu Windows projektu.

  2. Tworzenie nowego zestawu danych, oparte na bazie Northwind Customers tabeli.

  3. Tworzenie formularza z DataGridView do wyświetlania danych.

  4. Wypełnić zestaw danych z danymi z Customers tabeli w bazie danych Northwind.

  5. Po napełnieniu zestawu danych, użyj Narzędzia graficzne bazy danych w programie Visual Studio, aby uzyskać bezpośredni dostęp do Customers danych tabeli i zmiany rekordu.

  6. Następnie w formularzu Zmień ten sam rekord na inną wartość, aktualizowanie zestawu danych i podejmie próbę zapisania zmian w bazie danych, co skutkuje błędem współbieżność podniesionych.

  7. Przechwyci błąd, a następnie wyświetlić różnych wersji rekordu, pozwalając użytkownika w celu ustalenia, czy należy kontynuować i zaktualizować bazę danych lub anulować procesu aktualizacji.

Wymagania wstępne

W celu wykonania instrukcji tego przewodnika są potrzebne:

[!UWAGA]

Polecenia menu i okien dialogowych mogą różnić się od tych opisanych w Pomocy, w zależności od ustawień aktywnych lub wydania.Aby zmienić swoje ustawienia, wybierz Importuj i eksportuj ustawienia w menu Narzędzia.Aby uzyskać więcej informacji, zobacz Dostosowywanie ustawień środowiska deweloperskiego w Visual Studio.

Tworzenie nowego projektu

Twój instruktażu jest rozpocząć od tworzenia nowej aplikacji systemu Windows.

Aby utworzyć projekt nowej aplikacji dla systemu Windows

  1. Z menu Plik utwórz nowy projekt.

  2. Wybierz język programowania w Typów projektów okienka.

  3. Wybierz Aplikacji systemu Windows w Szablony okienka.

  4. Nazwa projektu ConcurrencyWalkthrough, a następnie kliknij przycisk OK.

    Visual Studio dodaje projekt do Eksploratora rozwiązań i wyświetla nowy formularz w projektancie.

Tworzenie zestawu danych Northwind

W tej sekcji spowoduje utworzenie zestawu danych o nazwie NorthwindDataSet.

Aby utworzyć NorthwindDataSet

  1. Od danych menu, wybierz polecenie dodać nowe dane źródło.

    Zostanie otwarty Kreator konfiguracji źródła danych.

  2. Wybierz bazy danych na Wybierz typ źródła danych strony.

  3. Wybierz połączenie z przykładową bazą danych Northwind z listy dostępnych połączeń lub kliknij Nowe połączenie Jeżeli połączenie nie jest dostępna na liście połączeń.

    [!UWAGA]

    Jeśli łączysz się do pliku lokalnej bazy danych, wybierz opcję nr pytanie, jeśli tak chcesz dodać plik do projektu.

  4. Kliknij przycisk Dalej na zapisać ciąg połączenia w pliku konfiguracyjnym aplikacji strony.

  5. Rozwiń węzeł tabele a następnie wybierz węzeł Customers tabeli.Domyślna nazwa zestawu danych powinna być NorthwindDataSet.

  6. Kliknij przycisk Zakończ Aby dodać zestaw danych do projektu.

Tworzenie formantu DataGridView powiązany z danymi

W tej sekcji zostanie utworzony DataGridView przez przeciągnięcie Klienci pozycję z Źródła danych okna na formularzu systemu Windows.

Aby utworzyć formant DataGridView jest powiązany z tabelą Klienci

  1. Od danych menu, wybierz polecenie Pokaż źródła danych aby otworzyć Okno źródła danych.

  2. Od Źródła danych Rozwiń okno NorthwindDataSet a następnie wybierz węzeł Klienci tabeli.

  3. Kliknij strzałkę w dół w węźle tabeli i wybierz DataGridView z listy rozwijanej.

  4. Przeciągnij tabelę na pusty obszar formularza.

    A DataGridView formantu o nazwie CustomersDataGridView i BindingNavigator o nazwie CustomersBindingNavigator są dodawane do formularz związany z BindingSource która z kolei jest powiązane z Customers w tabeli NorthwindDataSet.

Punkt kontrolny

Teraz można przetestować formularz, aby upewnić się, że działa zgodnie z oczekiwaniami do tej pory.

Aby przetestować formularz

  1. Naciśnij klawisz F5, aby uruchomić aplikację

    Zostanie wyświetlony formularz z DataGridView kontrolę na to, która jest wypełniona danymi z Customers tabeli.

  2. Od Debug menu, wybierz polecenie Zatrzymaj debugowanie.

Obsługa błędów współbieżności

Sposób obsługi błędów jest zależny od konkretnej firmy gotową aplikacji.Do tego przeglądu po Naruszenie współbieżności jest wywoływane, strategia do obsługi błędu współbieżność będzie służyć jako Ilustracja:

Aplikacja przedstawi użytkownikowi z trzech wersji rekordu:

  • Bieżący rekord w bazie danych.

  • Oryginalny rekord ładowane do zestawu danych.

  • Proponowane zmiany w zestawie danych.

Użytkownik będzie mógł zastąpić bazę danych z wersją proponowanych lub anulować aktualizację i odświeżyć zestawu danych nowymi wartościami z bazy danych.

Aby włączyć obsługę błędów współbieżności

  1. Tworzenie Obsługa błędów niestandardowych.

  2. Wyświetlanie opcji użytkownikowi.

  3. Przetwarzanie odpowiedzi użytkownika.

  4. Ponownie wyślij aktualizację lub przywrócenia danych w zestawie danych.

Dodając kod do obsługi wyjątek współbieżności

Podczas próby przeprowadzenia aktualizacji i pobiera o wyjątek, ogólnie chcesz zrobić coś z informacji dostarczonych przez podwyższoną wyjątek.

W tej sekcji należy dodać kod, który podejmie próbę aktualizacji bazy danych i obsługiwać dowolny DBConcurrencyException że może dostać podniesiony, a także wszelkie inne wyjątki.

[!UWAGA]

CreateMessage i ProcessDialogResults metody zostaną dodane w dalszej części tego instruktażu.

Aby dodać obsługę błędów dla błędów współbieżności

  1. Dodaj następujący kod poniżej 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. Zamień CustomersBindingNavigatorSaveItem_Click metodę do wywołania UpdateDatabase metoda tak wygląda podobnie do następującego:

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

Wyświetlanie opcji do użytkownika

Kod po prostu napisał wywołania CreateMessage procedurę, aby wyowietlić informacje o błędach do użytkownika.Do tego przeglądu okno komunikatu użyje do wyświetlania różnych wersji rekordu do użytkownika i Zezwalaj użytkownikowi na wybranie, czy zastąpić zmiany rekordu lub anulować edycję.Gdy użytkownik wybierze opcję (kliknie przycisk), w oknie komunikatu, odpowiedź jest przekazywana do ProcessDialogResult metody.

Aby utworzyć wiadomość, aby wyświetlić dla użytkownika

  • Utworzyć wiadomość, dodając następujący kod, aby Edytor kodu.Wprowadź ten kod poniżej UpdateDatabase metody.

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

Przetwarzanie odpowiedzi użytkownika

Konieczne będzie także kod, aby przetworzyć odpowiedzi przez użytkownika w oknie komunikatu.Dostępne opcje to aby zastąpić proponowana zmiana bieżącego rekordu w bazie danych lub zrezygnować z lokalnych zmian i Odśwież tabelę danych z rekordem obecnie w bazie danych.Jeśli użytkownik zdecyduje, że tak, Merge z wywoływana jest metoda preserveChanges argumentu równa true.Spowoduje to próba aktualizacji się powiodła się, ponieważ oryginalna wersja rekordu jest dopasowana do rekordu w bazie danych.

Aby przetworzyć użytkownika dane wejściowe z okna komunikatu

  • Dodaj następujący kod poniższy kod dodaje w poprzedniej sekcji.

    ' 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;
        }
    }
    

Testowanie

Teraz można przetestować formularz, aby upewnić się, że działa zgodnie z oczekiwaniami.Aby symulować Naruszenie współbieżności, musisz zmienić dane w bazie danych po napełnieniu NorthwindDataSet.

Aby przetestować formularz

  1. Naciśnij klawisz F5, aby uruchomić aplikację.

  2. Po pojawieniu się formularz, pozostawić je uruchomione i przełącz się do programu Visual Studio IDE.

  3. Od widoku menu, wybierz polecenie Server Explorer.

  4. W Server Explorer, rozwiń połączenie korzysta z aplikacji, a następnie rozwiń tabele węzła.

  5. Kliknij prawym przyciskiem myszy Klienci tabeli i wybierz polecenie Pokaż dane tabeli.

  6. W pierwszym rekordzie (ALFKI) zmienić ContactName do Maria Anders2.

    [!UWAGA]

    Przejdź do innego wiersza, aby zatwierdzić zmiany.

  7. Przełącz się do ConcurrencyWalkthroughjest uruchomiony formularz.

  8. W pierwszym rekordzie w formularzu (ALFKI), zmiana ContactName do Maria Anders1.

  9. Kliknij przycisk zapisać przycisk.

    Błąd współbieżności, a zostanie wyświetlone okno komunikatu.

  10. Kliknięcie przycisku nr Anuluje aktualizację i aktualizuje zestawu danych z wartościami obecnie w bazie danych, dlatego kliknięcie Tak zapisuje proponowana wartość w bazie danych.

Zobacz też

Koncepcje

Powiązywanie formantów formularzy systemu Windows z danymi w Visual Studio

Przygotowywanie aplikacji na otrzymywanie danych

Pobieranie danych do aplikacji

Powiązywanie kontrolek z danymi w Visual Studio

Edytowanie danych w aplikacji

Sprawdzanie poprawności danych

Zapisywanie danych

Inne zasoby

Wskazówki dotyczące danych

Łączenie z danymi w Visual Studio