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:
Utwórz nowy Aplikacji systemu Windows projektu.
Tworzenie nowego zestawu danych, oparte na bazie Northwind Customers tabeli.
Tworzenie formularza z DataGridView do wyświetlania danych.
Wypełnić zestaw danych z danymi z Customers tabeli w bazie danych Northwind.
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.
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.
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:
- Dostęp do przykładowej bazy danych Northwind z uprawnieniem do przeprowadzania aktualizacji.Aby uzyskać więcej informacji, zobacz Porady: instalacja przykładowych baz danych.
[!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
Z menu Plik utwórz nowy projekt.
Wybierz język programowania w Typów projektów okienka.
Wybierz Aplikacji systemu Windows w Szablony okienka.
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
Od danych menu, wybierz polecenie dodać nowe dane źródło.
Zostanie otwarty Kreator konfiguracji źródła danych.
Wybierz bazy danych na Wybierz typ źródła danych strony.
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.
Kliknij przycisk Dalej na zapisać ciąg połączenia w pliku konfiguracyjnym aplikacji strony.
Rozwiń węzeł tabele a następnie wybierz węzeł Customers tabeli.Domyślna nazwa zestawu danych powinna być NorthwindDataSet.
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
Od danych menu, wybierz polecenie Pokaż źródła danych aby otworzyć Okno źródła danych.
Od Źródła danych Rozwiń okno NorthwindDataSet a następnie wybierz węzeł Klienci tabeli.
Kliknij strzałkę w dół w węźle tabeli i wybierz DataGridView z listy rozwijanej.
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
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.
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
Tworzenie Obsługa błędów niestandardowych.
Wyświetlanie opcji użytkownikowi.
Przetwarzanie odpowiedzi użytkownika.
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
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."); } }
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
Naciśnij klawisz F5, aby uruchomić aplikację.
Po pojawieniu się formularz, pozostawić je uruchomione i przełącz się do programu Visual Studio IDE.
Od widoku menu, wybierz polecenie Server Explorer.
W Server Explorer, rozwiń połączenie korzysta z aplikacji, a następnie rozwiń tabele węzła.
Kliknij prawym przyciskiem myszy Klienci tabeli i wybierz polecenie Pokaż dane tabeli.
W pierwszym rekordzie (ALFKI) zmienić ContactName do Maria Anders2.
[!UWAGA]
Przejdź do innego wiersza, aby zatwierdzić zmiany.
Przełącz się do ConcurrencyWalkthroughjest uruchomiony formularz.
W pierwszym rekordzie w formularzu (ALFKI), zmiana ContactName do Maria Anders1.
Kliknij przycisk zapisać przycisk.
Błąd współbieżności, a zostanie wyświetlone okno komunikatu.
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
Sprawdzanie poprawności danych