Udostępnij za pośrednictwem


Obsługa wyjątku współbieżności w aplikacjach bazy danych programu .NET Framework

Uwaga

Zestawy danych i powiązane klasy to starsze technologie .NET Framework z początku 2000 roku, które umożliwiają aplikacjom pracę z danymi w pamięci, gdy aplikacje są odłączone od bazy danych. Są one szczególnie przydatne w przypadku aplikacji, które umożliwiają użytkownikom modyfikowanie danych i utrwalanie zmian z powrotem w bazie danych. Mimo że zestawy danych okazały się bardzo udaną technologią, zalecamy, aby nowe aplikacje platformy .NET używały platformy Entity Framework Core. Program Entity Framework zapewnia bardziej naturalny sposób pracy z danymi tabelarycznymi jako modelami obiektów i ma prostszy interfejs programowania.

Wyjątki współbieżności (System.Data.DBConcurrencyException) są wywoływane, gdy dwóch użytkowników próbuje zmienić te same dane w bazie danych w tym samym czasie. W tym przewodniku utworzysz aplikację systemu Windows, która ilustruje, jak przechwycić DBConcurrencyExceptionwiersz , zlokalizować wiersz, który spowodował błąd, i poznać strategię obsługi.

Ten przewodnik przeprowadzi Cię przez następujący proces:

  1. Utwórz nowy projekt aplikacji Windows Forms (.NET Framework).

  2. Utwórz nowy zestaw danych na podstawie tabeli Northwind Customers.

  3. Utwórz formularz z elementem , DataGridView aby wyświetlić dane.

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

  5. Użyj funkcji Pokaż dane tabeli w Eksploratorze serwera, aby uzyskać dostęp do danych tabeli Customers-table i zmienić rekord.

  6. Zmień ten sam rekord na inną wartość, zaktualizuj zestaw danych i spróbuj zapisać zmiany w bazie danych, co powoduje wystąpienie błędu współbieżności.

  7. Przechwyć błąd, a następnie wyświetl różne wersje rekordu, umożliwiając użytkownikowi określenie, czy kontynuować i zaktualizować bazę danych, czy anulować aktualizację.

Wymagania wstępne

W tym przewodniku użyto bazy danych SQL Server Express LocalDB i przykładowej bazy danych Northwind.

  1. Jeśli nie masz bazy danych SQL Server Express LocalDB, zainstaluj ją ze strony pobierania programu SQL Server Express lub za pośrednictwem Instalator programu Visual Studio. W Instalator programu Visual Studio można zainstalować bazę danych SQL Server Express LocalDB w ramach obciążenia Magazynu i przetwarzania danych lub jako pojedynczy składnik.

  2. Zainstaluj przykładową bazę danych Northwind, wykonując następujące kroki:

    1. W programie Visual Studio otwórz okno Eksplorator obiektów programu SQL Server. (program SQL Server Eksplorator obiektów jest instalowany w ramach obciążenia Magazyn danych i przetwarzanie w Instalator programu Visual Studio). Rozwiń węzeł PROGRAMU SQL Server. Kliknij prawym przyciskiem myszy wystąpienie bazy danych LocalDB i wybierz pozycję Nowe zapytanie.

      Zostanie otwarte okno edytora zapytań.

    2. Skopiuj skrypt Northwind Transact-SQL do schowka. Ten skrypt języka T-SQL tworzy bazę danych Northwind od podstaw i wypełnia ją danymi.

    3. Wklej skrypt języka T-SQL do edytora zapytań, a następnie wybierz przycisk Wykonaj .

      Po krótkim czasie zapytanie zakończy działanie i zostanie utworzona baza danych Northwind.

Tworzenie nowego projektu

Zacznij od utworzenia nowej aplikacji Windows Forms:

  1. W programie Visual Studio w menu Plik wybierz pozycję Nowy>projekt.

  2. Rozwiń węzeł Visual C# lub Visual Basic w okienku po lewej stronie, a następnie wybierz pozycję Pulpit systemu Windows.

  3. W środkowym okienku wybierz typ projektu Aplikacja Windows Forms.

  4. Nadaj projektowi nazwę ConcurrencyWalkthrough, a następnie wybierz przycisk OK.

    Projekt ConcurrencyWalkthrough zostanie utworzony i dodany do Eksplorator rozwiązań, a nowy formularz zostanie otwarty w projektancie.

Tworzenie zestawu danych Northwind

Następnie utwórz zestaw danych o nazwie NorthwindDataSet:

  1. W menu Dane wybierz pozycję Dodaj nowe źródło danych.

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

  2. Na ekranie Wybieranie typu źródła danych wybierz pozycję Baza danych.

    Kreator konfiguracji źródła danych w programie Visual Studio

  3. Wybierz połączenie z przykładową bazą danych Northwind z listy dostępnych połączeń. Jeśli połączenie nie jest dostępne na liście połączeń, wybierz pozycję Nowa Połączenie ion.

    Uwaga

    Jeśli łączysz się z lokalnym plikiem bazy danych, wybierz pozycję Nie po wyświetleniu monitu, czy chcesz dodać plik do projektu.

  4. Na ekranie Zapisz parametry połączenia do pliku konfiguracji aplikacji wybierz pozycję Dalej.

  5. Rozwiń węzeł Tabele i wybierz tabelę Customers (Klienci). Domyślną nazwą zestawu danych powinna być NorthwindDataSet.

  6. Wybierz pozycję Zakończ , aby dodać zestaw danych do projektu.

Tworzenie kontrolki DataGridView powiązanej z danymi

W tej sekcji utworzysz obiekt System.Windows.Forms.DataGridView , przeciągając element Klienci z okna Źródła danych do formularza systemu Windows.

  1. Aby otworzyć okno Źródła danych, w menu Dane wybierz pozycję Pokaż źródła danych.

  2. W oknie Źródła danych rozwiń węzeł NorthwindDataSet, a następnie wybierz tabelę Customers.

  3. Wybierz strzałkę w dół w węźle tabeli, a następnie wybierz pozycję DataGridView z listy rozwijanej.

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

    Kontrolka o nazwie CustomersDataGridView i BindingNavigator o nazwie CustomersBindingNavigator są dodawane do formularza powiązanego z elementem BindingSource.DataGridView Jest to z kolei powiązane z tabelą Customers w elemecie NorthwindDataSet.

Testowanie formularza

Teraz możesz przetestować formularz, aby upewnić się, że działa zgodnie z oczekiwaniami do tego momentu:

  1. Wybierz klawisz F5 , aby uruchomić aplikację.

    Formularz zostanie wyświetlony z kontrolką wypełnioną DataGridView danymi z tabeli Customers.

  2. W menu Debugowanie wybierz polecenie Zatrzymaj debugowanie.

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

Sposób obsługi błędów zależy od określonych reguł biznesowych, które zarządzają aplikacją. W tym przewodniku użyjemy następującej strategii jako przykładu obsługi błędu współbieżności.

Aplikacja przedstawia użytkownikowi trzy wersje rekordu:

  • Bieżący rekord w bazie danych

  • Oryginalny rekord załadowany do zestawu danych

  • Proponowane zmiany w zestawie danych

Następnie użytkownik może zastąpić bazę danych proponowaną wersją lub anulować aktualizację i odświeżyć zestaw danych przy użyciu nowych wartości z bazy danych.

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

  1. Utwórz niestandardową procedurę obsługi błędów.

  2. Wyświetl opcje dla użytkownika.

  3. Przetwarzanie odpowiedzi użytkownika.

  4. Wyślij ponownie aktualizację lub zresetuj dane w zestawie danych.

Dodawanie kodu do obsługi wyjątku współbieżności

Podczas próby wykonania aktualizacji i zgłoszenia wyjątku zazwyczaj chcesz wykonać coś z informacjami dostarczonymi przez zgłoszony wyjątek. W tej sekcji dodasz kod, który próbuje zaktualizować bazę danych. Można również obsługiwać wszystkie DBConcurrencyException , które mogą być zgłaszane, a także wszelkie inne wyjątki.

Uwaga

Metody CreateMessage i ProcessDialogResults zostaną dodane w dalszej części przewodnika.

  1. Dodaj następujący kod poniżej Form1_Load metody :

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

  1. Zastąp metodę CustomersBindingNavigatorSaveItem_Click , aby wywołać metodę UpdateDatabase , tak aby wyglądała następująco:

    private void customersBindingNavigatorSaveItem_Click(object sender, EventArgs e)
    {
        UpdateDatabase();
    }
    

Wyświetlanie opcji dla użytkownika

Właśnie napisany kod wywołuje procedurę CreateMessage , aby wyświetlić użytkownikowi informacje o błędzie. W tym przewodniku użyjesz pola komunikatu, aby wyświetlić różne wersje rekordu dla użytkownika. Dzięki temu użytkownik może zdecydować, czy zastąpić rekord zmianami, czy anulować edycję. Gdy użytkownik wybierze opcję (klika przycisk) w polu komunikatu, odpowiedź zostanie przekazana do ProcessDialogResult metody.

Utwórz komunikat, dodając następujący kod do Edytora kodu. Wprowadź następujący kod poniżej UpdateDatabase metody:

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

Potrzebny jest również kod, aby przetworzyć odpowiedź użytkownika na okno komunikatu. Opcje to zastąpienie bieżącego rekordu w bazie danych proponowaną zmianą lub porzucenie lokalnych zmian i odświeżenie tabeli danych rekordem, który jest obecnie w bazie danych. Jeśli użytkownik wybierze wartość Tak, Merge metoda jest wywoływana z argumentem preserveChanges ustawionym na true. Powoduje to pomyślną próbę aktualizacji, ponieważ oryginalna wersja rekordu jest teraz zgodna z rekordem w bazie danych.

Dodaj następujący kod poniżej kodu, który został dodany 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 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 zachowania formularza

Teraz możesz przetestować formularz, aby upewnić się, że działa zgodnie z oczekiwaniami. Aby zasymulować naruszenie współbieżności, zmieniasz dane w bazie danych po wypełnieniu elementu NorthwindDataSet.

  1. Wybierz klawisz F5 , aby uruchomić aplikację.

  2. Po pojawieniu się formularza pozostaw go uruchomiony i przejdź do środowiska IDE programu Visual Studio.

  3. W menu Widok wybierz pozycję Eksplorator serwera.

  4. W Eksploratorze serwera rozwiń połączenie używane przez aplikację, a następnie rozwiń węzeł Tabele .

  5. Kliknij prawym przyciskiem myszy tabelę Customers (Klienci ), a następnie wybierz polecenie Show Table Data (Pokaż dane tabeli).

  6. W pierwszym rekordzie (ALFKI) zmień wartość ContactName na Maria Anders2.

    Uwaga

    Przejdź do innego wiersza, aby zatwierdzić zmianę.

  7. Przejdź do działającego formularza concurrencyWalkthrough.

  8. W pierwszym rekordzie w formularzu (ALFKI) zmień wartość ContactName na Maria Anders1.

  9. Wybierz przycisk zapisywania.

    Zostanie zgłoszony błąd współbieżności i zostanie wyświetlone okno komunikatu.

    Wybranie pozycji Nie anuluje aktualizacji i zaktualizuje zestaw danych przy użyciu wartości, które znajdują się obecnie w bazie danych. Wybranie pozycji Tak spowoduje zapisanie proponowanej wartości w bazie danych.