مشاركة عبر


الإرشادات التفصيلية: معالجة استثناء تزامن

استثناءات التزامن ( DBConcurrencyException) يتم مرفوع عند محاولة مستخدمين إلى تغيير نفس البيانات في قاعدة بيانات في نفس الوقت. في هذه معاينة التي إنشاء أحد تطبيقات Windows يقوم بتوضيح catching DBConcurrencyException، يمكن استخدام تحديد موقع الصف الذي تسبب بالخطأ، واستراتيجية واحدة لمعالجة it.

تأخذ هذه معاينة من خلال العملية التالية:

  1. إنشاء جديد مشروع تطبيق Windows.

  2. إنشاء جديد فئة البيانات يعمل تشغيل Northwind Customersجدول.

  3. قم بإنشاء نموذج بواسطة DataGridViewإلى عرض بيانات.

  4. تعبئة فئة البيانات مع بيانات من Customersجدول في قاعدة بيانات Northwind.

  5. بعد إدخال ورقة العمل، استخدم Visual Database Toolsفي ‏‫Visual Studio إلى الوصول مباشرة Customersجدول بيانات وتغيير السجل.

  6. ثم في النموذج، وتغيير بنفس سجل إلى القيمة مختلفة، قم بتحديث ورقة العمل، ومحاولة كتابة التغييرات إلى قاعدة بيانات، والذي ينتج عن خطأ التزامن الذي يتم مرفوع.

  7. جذب الخطأ، ثم قم بعرض إصدارات مختلفة من السجل، مما يسمح للمستخدم إلى تحديد ما إذا كان إلى متابعة وتحديث قاعدة بيانات، أو إلى إلغاء تحديث.

المتطلبات الأساسية

في ترتيب إلى إكمال this معاينة, you need:

ملاحظة

قد تختلف مربعات الحوار وأوامر القائمة التى تشاهدها الان عن تلك الموصوفة في التعليمات اعتماداً على الإعدادات النشطة أو الإصدار الخاص بك. لتغيير الإعدادات الخاصة بك, اختر إعدادات الاستيراد و التصدير ضمن القائمة أدوات . لمزيد من المعلومات، راجع العمل مع إعدادات.

إنشاء مشروع جديد

بدء معاينة الخاصة بك بإنشاء Windows جديد تطبيق.

إلى إنشاء مشروع تطبيقات Windows جديد

  1. من قائمة ملف، إنشاء مشروع جديد.

  2. تحديد لغة برمجة في أنواع مشروع جزء.

  3. تحديد تطبيقات Windows في الجزء القوالب.

  4. اسم مشروع ConcurrencyWalkthrough، و ثم انقر فوق ‏‏موافق .

    يضيف ‏‫Visual Studio مشروع إلى من مستكشف الحل و عرض نموذج جديد في المصمم.

إنشاء Northwind فئة البيانات

في هذا الجزء يمكنك إنشاء فئة البيانات باسم NorthwindDataSet.

إلى إنشاء NorthwindDataSet

  1. من قائمة بيانات ، اختيار إضافة جديد البيانات المصدر.

    تفتح معالج تكوين مصدر البيانات

  2. تحديد من قاعدة بيانات تشغيل الصفحة اختيار "نوع مصدر البيانات".

  3. تحديد اتصال بقاعدة بيانات Northwind من lهوt الاتصالات متوفر، أو انقر فوق من اتصال جديد في حالة الاتصال هو غير متوفرة في lهوt الاتصالات.

    ملاحظة

    إذا كنت تتصل بملف قاعدة بيانات محلية، تحديد بلا عند سؤالك ما إذا كنت قد ترغب في إضافة الملف إلى مشروع الخاص بك.

  4. انقر فوق التالي في الصفحة حفظ سلسلة الاتصال إلى ملف تكوين تطبيق.

  5. المتوقعة و العقدة جداول و حدد Customersجدول. الاسم الافتراضي فئة البيانات يجب أن يكون NorthwindDataSet.

  6. انقر فوق إنهاء إلى إضافة ورقة العمل إلى المشروع.

إنشاء عرض شبكة البيانات مرتبط ببيانات عنصر تحكم

في هذا الجزء يمكنك إنشاء DataGridViewبسحب العنصر العملاء من الإطار مصادر بيانات إلى نموذج Windows الخاص بك.

لإنشاء عرض شبكة البيانات التحكم التي هو مرتبط بجدول "العملاء"

  1. من قائمة بيانات ، اختيار إظهار المصادر البيانات إلى فتح نافذة المصادر البيانات.

  2. من الإطار موارد بيانات توسيع العقدة NorthwindDataSet و تحديد الجدول العملاء.

  3. انقر فوق السهم أسفل تشغيل عقدة جدول و حدد عرض شبكة البيانات من المنسدلة-لأسفل القائمة.

  4. اسحب الجدول إلى منطقة فارغ على جهاز نموذج.

    على DataGridViewعنصر التحكم المسمى CustomersDataGridViewو BindingNavigatorباسم CustomersBindingNavigatorتضاف إلى نموذج منضم إلى BindingSourceالتي هو مرتبط بدوره Customersالجدول في NorthwindDataSet.

Checkpoint (نقطة التحقق)

الآن يمكنك اختبار النموذج للتأكد من أنها تصرف كـ المتوقع إلى هذه النقطة.

لاختبار النموذج

  1. اضغط على F5 إلى تشغيل تطبيق

    يظهر النموذج مع DataGridViewالتحكم فيها التي هو ببيانات من Customersجدول.

  2. من قائمة تصحيح ، اختيار اوقف التصحيح.

معالجة أخطاء تزامن

كيف تقوم بمعالجة أخطاء هو تعتمد على قواعد عمل معينة التي تتحكم في تطبيق الخاص بك. لترتيب هو معاينة، بعد انتهاك التزامن هو raهوed، استراتيجية التالية لمعالجة الخطأ التزامن لاستخدامه كتوضيح:

ستمثل تطبيق مستخدم مع ثلاثة إصدارات سجل:

  • الحالي سجل في قاعدة بيانات.

  • تم تحميله السجل الأصلي في فئة البيانات.

  • التغييرات المقترحة في فئة البيانات.

مستخدم من ثم إلى أما الكتابة فوق قاعدة بيانات بالإصدار المقترح أو قم بإلغاء تحديث وتحديث مجموعة البيانات بقيم جديدة من قاعدة بيانات.

إلى تمكين معالجة أخطاء التزامن

  1. قم بإنشاء معالج خطأ مخصصة.

  2. عرض خيارات للمستخدم.

  3. عملية استجابة للمستخدم.

  4. أعد إرسال تحديث، أو يعيد تعيين المعاملة بيانات الموجودة في فئة بيانات.

إضافة تعليمات برمجية لمعالجة ‏‏ استثناء تزامن

عند محاولة إجراء تحديث ويحصل على استثناء مرفوع، تحتاج إلى القيام بشيء ما باستخدام المعلومات التي يوفرها بشكل عام مرفوع ‏‏ استثناء.

في هذا القسم سيتم إضافة التعليمة البرمجية التي ستقوم بمحاولة تحديث قاعدة بيانات ومعالجة أي DBConcurrencyExceptionالتي قد يحصل مرفوع، كذلك أي غير ذلك استثناء.

ملاحظة

CreateMessageو ProcessDialogResultsسيتم تمت الإضافة وظائف لاحقاً في هذه معاينة.

إلى إضافة خطأ معالجة للخطأ التزامن

  1. إضافة التعليمة البرمجية التالية أدناه Form1_Loadأسلوب:

    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. استبدال CustomersBindingNavigatorSaveItem_Clickأسلوب إلى الاتصال UpdateDatabaseأسلوب لذلك فإنها تظهر كما يلي:

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

عرض خيارات إلى "المستخدم"

تعليمات برمجية فقط كتبته مكالمات CreateMessageإجراء لعرض معلومات الخطأ للمستخدم. هذه معاينة، التي تستخدم صندوق رسالة إلى عرض الإصدارات المختلفة من السجل إلى المستخدم ويسمح للمستخدم إلى اختيار ما إذا كان إلى الكتابة فوق السجل بالتغييرات أو إلغاء الأمر التحرير. بمجرد قيام مستخدم بتحديد خيار (بالنقر فوق زر) على الرسالة صندوق الاستجابة هو التي تم تمريرها إلى ProcessDialogResultالأسلوب.

إلى إنشاء الرسالة إلى عرض إلى المستخدم

  • إنشاء رسالة بإضافة التعليمة البرمجية التالية إلى محرر تعليمات برمجية. قم بإدخال هذا تعليمات برمجية أدناه UpdateDatabaseالأسلوب.

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

معالجة استجابة مستخدم

ستحتاج أيضا إلى التعليمات البرمجية ل عملية استجابة مستخدم لصندوق الرسالة. أما أن تكون الخيارات إلى الكتابة فوق السجل الحالي في قاعدة بيانات بالتغييرات المقترحة أو التخلي عن التغييرات المحلية وتحديث جدول بيانات بالسجل الموجود حاليا في قاعدة بيانات. إذا اختار مستخدم نعم، Mergeأسلوب هو تسمى تعيين وسيطة preserveChanges true. سوف يؤدي ذلك محاولة تحديث إلى تكون ناجحة، لأن الإصدار الأصلي من السجل الآن مطابقاً للسجل في قاعدة بيانات.

إلى معالجة إدخال مستخدم من صندوق الرسالة

  • قم بإضافة التعليمة البرمجية التالية أدناه رمز تمت الإضافة في مقطع السابق.

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

الاختبار

يمكنك الآن اختبار النموذج للتأكد من أنه يعمل كما هو متوقع. تحتاج إلى تغيير البيانات في قاعدة بيانات بعد إدخال NorthwindDataSet لمحاكاة انتهاك التزامن.

لاختبار النموذج

  1. إضغط على F5 لتشغيل التطبيق.

  2. بعد ظهور النموذج، تركه تشغيل و تبديل إلى IDE Studio Visual Basic.

  3. من قائمة عرض ، اختيار مستكشف Server .

  4. في من مستعرض الخادم، قم بتوسيع الاتصال التطبيق الخاص بك هو استخدام ثم قم بتوسيع العقدة جداول.

  5. انقر نقراً مزدوجاً فوق الجدول العملاء و حدد إظهار جدول بيانات.

  6. في أول سجل ( ALFKI) بتغيير ContactNameإلى ماريا Anders2.

    ملاحظة

    انتقل إلى صف مختلف قبول تغيير.

  7. تحويل إلى ConcurrencyWalkthroughتشغيل نموذج.

  8. في السجل أول على نموذج ( ALFKI)، تغيير ContactNameإلى ماريا Anders1.

  9. انقر فوق الزر حفظ.

    الخطأ التزامن هو يظهر raهوed، وعند ظهور صندوق الرسالة.

  10. يؤدي النقر فوق عدم إلغاء تحديث ويقوم بتحديث ورقة العمل باستخدام قيم الموجودة حاليا في قاعدة بيانات، بينما يؤدي النقر فوق نعم كتابة قيمة المقترحة إلى قاعدة بيانات.

راجع أيضًا:

المبادئ

ما هو الجديد في تطوير التطبيقات للبيانات

ربط عناصر تحكم النماذج Windows إلى بيانات في ‏‫Visual Studio

قم بربط عناصر التحكم إلى البيانات في ‏‫Visual Studio

موارد أخرى

الإرشادات التفصيلية الخاصة بالبيانات

الاتصال إلى البيانات في ‏‫Visual Studio

قم بإعداد تطبيق الخاص بك إلى تلقي بيانات

إحضار بيانات في تطبيق الخاص بك

‏‏تحرير بيانات في تطبيق الخاص بك

التحقق من صحة بيانات

حفظ بيانات