لا يمكن تصيد الاخطاء ODBC معينه في الخاصيه OnError ل# نموذج (KB 206175)

ملاحظة: نرغب في تزويدك بأحدث محتوى تعليمات لدينا بأسرع ما يمكن وبلغتك الخاصة. وقد تمت ترجمة هذه الصفحة آلياً وقد تحتوي على أخطاء نحوية أو أخطاء تتعلق بالدقة. كما نهدف إلى أن يكون هذا المحتوى مفيداً لك. هل يمكنك إخبارنا إذا كانت المعلومات مفيدة لك في أسفل هذه الصفحة؟ إليك المقالة بالغة الإنجليزية لسهولة الرجوع إليها.

اذا قمت ب# تعيين خاصيه OnError نموذج Access ل# اجراء حدث، لا يمكن استرداد وصف خطا ODBC في هذا الاجراء، و# ايضا لا تصيد الاخطاء ODBC معينه. عند حدوث خطا ODBC، فقط المعلومات التي يتم تمريرها الي اجراء حدث خطا هو عدد خطا عام، مثل 3146، الذي يتطابق مع رساله الخطا: فشل استدعاء ODBC.

السبب

رسائل الخطا ODBC تتالف عاده من مكونين. المكون الاولي هي الخطا 3146، يتم وصف الخاصه به:

فشل استدعاء ODBC

معلومات الاخطاء الخاصه ب# الخادم الموجود في المكون الثاني، الذي يمكنك استرداد رقم خطا و# وصف مثل:

[Microsoft] [برنامج تشغيل ODBC SQL Server] [SQL Server] < رساله خطا خاصه ب# الخادم > (#< رقم الخطا >)

اذا قمت ب# تعيين خاصيه OnError نموذج ل# اجراء حدث، يمكنك تعويض عدد المكون الاول الخطا، و# لكن يتعذر عليك تصيد عدد المكون الثاني. المعلومات الخاصه ب# الخادم في الجزء الثاني من الخطا ODBC تظهر علي الشاشه بعد التعليمه البرمجيه ل# انتهاء قيد التشغيل، الا اذا قمت ب# تضمين السطر التالي في event الاجراء:

الاستجابه = أكداتايرركونتينوي

الدقة

ملاحظة: توفر Microsoft امثله البرمجه ل# التوضيح فقط، دون ضمان او مضمن. هذا يتضمن، و# لكن ليس الحصر، الضمانات القابليه او الملاءمه ل# غرض معين. تفترض هذه المقاله كنت معتادا علي لغه البرمجه شرحها و# الادوات التي يتم استخدامها ل# انشاء الاجراءات و# تصحيحها. يمكنك مساعده المهندسين دعم Microsoft شرح وظيفه اجراء محدد، و# لكن لن يقوموا ب# تعديل هذه الامثله ل# تقديم وظيفه اضافيه او انشاء اجراءات ل# تلبيه متطلبات محدده.

يمكنك انشاء Microsoft Visual Basic for applications ب# الذي يستخدم كائنات الوصول الي البيانات (DAO) ل# تحديث بنيوي يستند الي النموذج. يتيح لك هذا الخيار ل# تصيد اي رساله الخطا التي تتلقاها.

DAO يحتوي علي مجموعه الاخطاء التي يمكنك استخدامها ل# تعقب المعلومات الخاصه ب# الخادم في الجزء الثاني من الخطا ODBC. عند حدوث خطا ODBC، يتم تخزين المكون الاولي في العنصر الاول ل# المجموعه اخطاء، و# يتم تخزين المكون الثاني في العنصر الثاني.

يستخدم المثال في هذه المقاله الحدث قبل التحديث بدلا من الحدث الخطا ل# تصيد الاخطاء ODBC معينه. ل# انشاء داله يعوض اخطاء ODBC معينه عند حدوث الحدث قبل التحديث ل# نموذج، اتبع الخطوات التاليه:

  1. انشاء قاعده بيانات سطح مكتب فارغه.

  2. ارتباط الي الجدول dbo_Accounts في قاعده بيانات نموذج AdventureWorks في Microsoft SQL Server.

  3. استخدام "معالج النماذج"-تخطيط عمودي ل# انشاء نموذج جديد يستند الي جدول الحسابات.

  4. احفظ النموذج ك# فرماككونتس.

  5. انشاء وحده نمطيه جديده، و# من ثم اكتب السطر التالي في مقطع التعريفات اذا كان ذلك الخط لم موجودا هناك:

    Option Explicit

  6. اكتب او الصق الاجراء التالي في الوحده النمطيه:

    Public Function SaveRecODBC(SRO_form As Form) As Boolean
    ' ***************************************************************
    ' Function: SaveRecODBC
    ' Purpose: Updates a form based on a linked ODBC table
    ' and traps any ODBC errors.
    ' Arguments: SRO_Form, which refers to the form.
    ' Returns: True if successful or False if an error occurs.
    ' ***************************************************************
    On Error GoTo SaveRecODBCErr
    Dim fld As Field, ctl As Control
    Dim errStored As Error
    Dim rc As DAO.Recordset
    
    ' Check to see if the record has changed.
    If SRO_form.Dirty Then
        Set rc = SRO_form.Recordset.Clone
        If SRO_form.NewRecord Then
            rc.AddNew
            For Each ctl In SRO_form.Controls
                ' Check to see if it is the type of control
                ' that has a ControlSource.
                If ctl.ControlType = acTextBox Or _
                    ctl.ControlType = acComboBox Or _
                    ctl.ControlType = acListBox Or _
                    ctl.ControlType = acCheckBox Then
                    ' Verify that a value exists in the ControlSource.
                    If ctl.Properties("ControlSource") <> "" Then
                        ' Loop through the fields collection in the
                        ' RecordsetClone. If you find a field name
                        ' that matches the ControlSource, update the
                        ' field. If not, skip the field. This is
                        ' necessary to account for calculated controls.
                        For Each fld In rc.Fields
                            ' Find the field and verify
                            ' that it is not Null.
                            ' If it is Null, don't add it.
                            If fld.Name = ctl.Properties("ControlSource") _
                            And Not IsNull(ctl) Then
                                fld.Value = ctl
                                ' Exit the For loop
                                ' if you have a match.
                                Exit For
                            End If
                        Next fld
                    End If ' End If ctl.Properties("ControlSource")
                End If ' End If ctl.controltype
            Next ctl
            rc.Update
        Else
            ' This is not a new record.
            ' Set the bookmark to synchronize the record in the
            ' RecordsetClone with the record in the form.
            rc.Bookmark = SRO_form.Bookmark
            rc.Edit
            For Each ctl In SRO_form.Controls
                ' Check to see if it is the type of control
                ' that has a ControlSource.
                If ctl.ControlType = acTextBox Or _
                    ctl.ControlType = acComboBox Or _
                    ctl.ControlType = acListBox Or _
                    ctl.ControlType = acCheckBox Then
                    ' Verify that a value exists in the
                    ' ControlSource.
                    If ctl.Properties("ControlSource") <> "" Then
                        ' Loop through the fields collection in the
                        ' RecordsetClone. If you find a field name
                        ' that matches the ControlSource, update the
                        ' field. If not, skip the field. This is
                        ' necessary to account for calcualted controls.
                        For Each fld In rc.Fields
                            ' Find the field and make sure that the
                            ' value has changed. If it has not
                            ' changed, do not perform the update.
                            If fld.Name = ctl.Properties("ControlSource") _
                                And fld.Value <> ctl And _
                                Not IsNull(fld.Value <> ctl) Then
                                fld.Value = ctl
                                ' Exit the For loop if you have a match.
                                Exit For
                            End If
                        Next fld
                    End If ' End If ctl.Properties("ControlSource")
                End If ' End If ctl.controltype
            Next ctl
            rc.Update
        End If ' End If SRO_form.NewRecord
    End If ' End If SRO_form.Dirty
    ' If function has executed successfully to this point then
    ' set its value to True and exit.
    SaveRecODBC = True
    
    Exit_SaveRecODBCErr:
        Exit Function
    
    SaveRecODBCErr:
    ' The function failed because of an ODBC error.
    ' Below are a list of some of the known error numbers.
    ' If you are not receiving an error in this list,
    ' add that error to the Select Case statement.
    For Each errStored In DBEngine.Errors
        Select Case errStored.Number
            Case 3146 ' No action -- standard ODBC--Call failed error.
            Case 2627 ' Error caused by duplicate value in primary key.
                MsgBox "You tried to enter a duplicate value in the Primary Key."
            Case 3621 ' No action -- standard ODBC command aborted error.
            Case 547 ' Foreign key constraint error.
                MsgBox "You violated a foreign key constraint."
            Case Else ' An error not accounted for in the Select Case ' statement.
                On Error GoTo 0
                Resume
        End Select
    Next errStored
    SaveRecODBC = False
    Resume Exit_SaveRecODBCErr
    
    End Function
    
  7. حفظ الوحده النمطيه ب# اسم فريد و# اغلاق نافذه الوحده النمطيه.

  8. عين الخاصيه قبل التحديث نموذج فرماككونتس الي اجراء الحدث التالي:

    Private Sub Form_BeforeUpdate(Cancel As Integer)
    ' If you can save the changes to the record undo the changes on the form.
    If SaveRecODBC(Me) Then Me.Undo
    ' If this is a new record go to the last record on the form.
    If Me.NewRecord Then
        RunCommand acCmdRecordsGoToLast
    Else
        ' If you can't update the record, cancel the BeforeUpdate event.
        Cancel = -1
    End If
    End Sub
    
  9. علي القائمه " تصحيح "، انقر فوق ترجمه < اسم قاعده البيانات >

  10. في حال حدوث ليس خطا، احفظ النموذج.

  11. فتح النموذج فرماككونتس، و# من ثم اضافه سجل جديد او تحرير سجل.

    عندما تقوم ب# تغيير الي سجل، يتم حفظ السجل عند الانتقال الي سجل اخر. اذا حدث خطا ODBC، تظهر رساله مخصصه يستند الي الخطا الخاصه ب# الخادم، و# العام "ODBC--فشل استدعاء" و# يتم اعتراض الرساله.

تعزيز مهارات Office
استكشاف التدريب
الحصول على الميزات الجديدة أولاً
الانضمام إلى Office Insider

هل كانت المعلومات مفيدة؟

نشكرك على ملاحظاتك!

شكراً لك على الملاحظات! يبدو أنه من المفيد إيصالك بأحد وكلاء دعم Office لدينا.

×