İzlenecek yol: Bir Eşzamanlılık Özel Durumunu İşleme
Eşzamanlılık özel durumlar (DBConcurrencyException) iki kullanıcı aynı anda aynı verileri bir veritabanında değiştirmeye çalıştıklarında ortaya çıkar.Bu anlatımda oluşturduğunuz yakalama gösteren bir Windows uygulaması bir DBConcurrencyException, locating satır, neden hata ve sizin için bir strateji işlemek için kullanabilirsiniz.
Bu anlatım aşağıdaki süreci alır:
Yeni bir Windows Application proje.
Northwind üzerinde temel alan yeni bir dataset yaratmak Customers tablo.
Bir form oluşturmak bir DataGridView verileri görüntülemek için.
Bir dataset veriyle doldurmak Customers Northwind veritabanındaki tablo.
Dataset doldurduktan sonra kullanmak Görsel Veritabanı Araçları doğrudan erişmek için Visual Studio Customers veri tablo ve bir kaydı değiştirin.
Sonra formdaki aynı kaydı değiştirmek için farklı bir değer, veri kümesini güncelleştirmek ve değişiklikleri yaratılmasına eşzamanlılık hataya yol açar veritabanına yazma girişimi.
Hatayı yakalayın, sonra devam etmek ve veritabanını güncelleştirmek için veya güncelleştirmeyi iptal etmek için karar vermek kullanıcının kaydı farklı sürümlerini görüntüler.
Önkoşullar
Bu yönergeyi tamamlamak için gerekli olanlar:
- Güncelleştirmeleri gerçekleştirmek için izni olan Northwind örnek veritabanına erişim.Daha fazla bilgi için bkz. Nasıl Yapılır: Örnek Veritabanları Yükleme.
[!NOT]
Gördüğünüz iletişim kutuları ve menü komutları, etkin ayarlarınıza ve ürün sürümüne bağlı olarak Yardım menüsünde açıklanana göre farklılık gösterebilir.Ayarlarınızı değiştirmek için Araçlar menüsünden İçeri ve Dışarı Aktarma Ayarları'nı seçin.Daha fazla bilgi için bkz. Visual Studio'da Geliştirme Ayarlarını özelleştirme.
Yeni Bir Proje Oluşturma
Yeni bir Windows uygulaması oluşturarak, gözden geçirme başlar.
Yeni bir Windows Uygulaması projesi oluşturmak
Gelen Dosya menüsünde, yeni bir proje oluşturun.
Bir programlama dili seçin Proje türleri bölmesi.
Seçin Windows Application de şablonları bölmesi.
Proje adı ConcurrencyWalkthroughı Tamam.
Visual Studio Çözüm Gezgini öğesine projeyi ekler ve tasarımcıda yeni bir biçim gösterir.
Northwind veri kümesi oluşturma
Bu bölümde adlı bir dataset oluşturur NorthwindDataSet.
NorthwindDataSet oluşturmak için
Gelen veri menüsünden seçin eklemek yeni veri kaynağı.
Seçin veritabanı üzerinde veri kaynağı türü seçin sayfa.
Kullanılabilir bağlantılar listesinden Northwind örnek veritabanına bir bağlantı seçin veya tıklatın Yeni bir bağlantı bağlantıyı Bağlantılar listesinde kullanılabilir değilse.
[!NOT]
Bir yerel veritabanı dosyasına bağlanıyorsanız seçin No isterseniz istediğiniz dosyayı projenize eklemek sorulduğunda.
' I İleri üzerinde bağlantı dizesini uygulama yapılandırma dosyasına kaydet sayfa.
Genişletme Tablo düğümünü seçip alt Customers tablo.Veri kümesi için varsayılan adı olması gerekir NorthwindDataSet.
' I Son için veri kümesini projeye ekleyin.
Veriye bağlı DataGridView denetimi oluşturma
Bu bölümde, oluşturacağınız bir DataGridView sürükleyerek Müşteriler gelen madde Veri kaynakları Windows Form üzerine pencere.
Customers tablosuna bağlı bir DataGridView denetimi oluşturmak için
Gelen veri menüsünden seçin Veri kaynağını Göster açmak için Veri kaynakları penceresi.
Gelen Veri kaynakları pencereyi genişletmek NorthwindDataSet düğüm ve seçme Müşteriler tablo.
Tablo düğümü üzerindeki aşağı oku tıklatın ve seçin DataGridView aþaðý açýlan listesinden.
Tablo boş bir form alanı sürükleyin.
A DataGridView adlı bir denetim CustomersDataGridView ve bir BindingNavigator adlı CustomersBindingNavigator bağlı forma eklenen BindingSource , sırayla bağlı Customers tablosundaki NorthwindDataSet.
Checkpoint
Bu noktaya kadar beklendiği gibi davranan emin olmak için form artık sınayabilirsiniz.
Formu sınamak için
Uygulamayı çalıştırmak için F5 tuşuna basın
Formun görünür bir DataGridView gelen verilerle doldurulduğunu denetim üzerindeki Customers tablo.
Gelen hata ayıklama menüsünden seçin Stop Debugging.
Eşzamanlılık hataları işleme
Hataları işlemek nasıl uygulamanızı yöneten belirli iş kurallarını bağlıdır.Bu anlatım için eşzamanlılık ihlali kaldırıldıktan sonra eşzamanlılık hatayı işlemek için aşağıdaki strateji bir örnek kullanılacak:
Uygulama kullanıcı kaydı üç sürümü sunuyor:
Geçerli kayıt veritabanı içinde.
Özgün kayıt kümesine yüklenir.
Önerilen değişiklikleri DataSet.
Sonra veritabanı önerilen sürümü üzerine veya güncelleştirmeyi iptal eder ve veri kümesi veritabanından yeni değerlerle yenilemek mümkün kullanıcıdır.
Eşzamanlılık hatalarının işlenmesini etkinleştirmek için
Bir özel hata işleyicisi yaratın.
Kullanıcı seçenekleri görüntüler.
Kullanıcının yanıtını işlemek.
Güncelleştirmeyi yeniden gönderin veya veri kümesindeki sıfırlayın.
Eşzamanlılık özel durum işlemek için kod ekleme
Bir güncelleştirme gerçekleştirme girişimi bir özel duruma neden oldu, genellikle özel durumu tarafından sağlanan bilgilerle şeyler yapılmasını istersiniz.
Bu bölümdeki herhangi işlemek ve veritabanını güncelleştirmek için çalışacak kod ekleyeceksiniz DBConcurrencyException , yükseltilmiş, yanı sıra diğer bir özel durum.
[!NOT]
CreateMessage Ve ProcessDialogResults bu anlatımın yöntemleri eklenir.
Hata işleme için tutarlılık hatası eklemek için
Aşağıdaki kodu ekleyip Form1_Load yöntemi:
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."); } }
Yerine CustomersBindingNavigatorSaveItem_Click yöntemini çağırmak için UpdateDatabase yöntemi aşağıdaki gibi görünür:
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(); }
Kullanıcı seçeneklerini görüntüleme
Yeni kod yazdýnýz çağrıları CreateMessage kullanıcıya hata bilgisini görüntülemek için yordamı.Bu anlatım için kullanıcı kaydı farklı sürümlerini görüntüler ve kaydı değişikliklerle değiştirmek veya düzenlemeyi iptal etmek seçmesine izin vermek için bir ileti kutusu kullanır.İleti kutusunda bir seçenek (bir düğmeyi tıklattığında) kullanıcının seçtiği sonra yanıt için geçirilen ProcessDialogResult yöntem.
Kullanıcıya görüntülenecek bir ileti oluşturmak için
Aşağıdaki kodu ekleyerek ileti oluşturma Kod Düzenleyicisi'ni.Bu kodu UpdateDatabase yöntem.
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; }
Kullanıcının yanıtını işleme
İleti kutusu kullanıcının yanıtı işlemek için kod da gerekir.Önerilen değişiklikle veritabanında geçerli kaydın üzerine veya yerel bir değişikliği iptal ve veri tablosu veritabanındaki kayıt yenileme seçeneklerdir.Evet, kullanıcı seçerse, Merge yöntemi ile çağrıldığında preserveChanges bağımsız değişkeni ayarlamak true.Bu kaydın özgün sürümünü şimdi kayıt veritabanında eşleşir çünkü başarılı olabilmesi güncelleştirme girişimi neden olur.
İleti kutusunda kullanıcı işlemeye giriş
Aşağıda önceki bölümde eklenen kodu aşağıdaki kodu ekleyin.
' 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; } }
Test etme
Artık formun beklendiği gibi davranan emin olmak için test edebilirsiniz.Eşzamanlılık ihlali benzetimini yapmak için NorthwindDataSet doldurduktan sonra veritabanındaki verileri değiştirmeniz gerekir.
Formu sınamak için
F5 tuşuna basarak uygulamayı çalıştırın.
Form göründükten sonra çalışır bırakmak ve Visual Studio IDE geçin.
Gelen Görünüm menüsünden seçin Server Explorer.
İçinde Server Explorer, uygulamanızı kullanan bağlantı genişletin ve sonra genişletin Tablo düğümü.
Sağ Müşteriler seçin ve tablo Show Table Data.
İlk kayda (ALFKI) değiştirme ContactName için Maria Anders2.
[!NOT]
Değişikliği uygulamak için farklı bir satıra gidin.
Geçiş ConcurrencyWalkthroughformu çalıştıran kullanıcının.
Formdaki ilk kayıttaki (ALFKI), değiştirmek ContactName için Maria Anders1.
' I kaydetmek düğmesi.
Tutarlılık hatası ortaya çıkar ve ileti kutusu görünür.
Tıklatarak No güncelleştirmeyi iptal eder ve dataset veritabanındaki geçerli değerlerle güncelleştirir tıklatarak ise Evet önerilen değer veritabanına yazar.
Ayrıca bkz.
Kavramlar
Visual Studio'da Verilere Windows Forms Denetimleri Bağlama
Uygulamanızı Veri Almaya Hazırlama
Visual Studio'da Verilere Denetimler Bağlama
Uygulamanızdaki Verileri Düzenleme