ข้ามไปที่เนื้อหาหลัก
Office

ไม่สามารถดักจับข้อผิดพลาด ODBC ที่เฉพาะเจาะจงใน OnError คุณสมบัติของฟอร์ม (KB 206175)

หมายเหตุ: เราต้องการมอบเนื้อหาวิธีใช้ปัจจุบันในภาษาของคุณให้กับคุณโดยเร็วที่สุดเท่าที่เราจะทำได้ หน้านี้ได้รับการแปลด้วยระบบอัตโนมัติ และอาจมีข้อผิดพลาดทางไวยากรณ์หรือความไม่ถูกต้อง จุดประสงค์ของเราคือเพื่อให้เนื้อหานี้มีประโยชน์กับคุณ คุณแจ้งให้เราทราบว่าข้อมูลดังกล่าวมีประโยชน์ต่อคุณที่ด้านล่างของหน้านี้ได้หรือไม่ นี่คือบทความภาษาอังกฤษเพื่อให้ง่ายต่อการอ้างอิง

ถ้าคุณตั้งค่า OnError คุณสมบัติของฟอร์ม Access กระบวนงานเหตุการณ์ คุณไม่สามารถเรียกใช้คำอธิบายของข้อผิดพลาด ODBC ในขั้นตอนที่ และคุณยังไม่สามารถดักจับข้อผิดพลาด ODBC เมื่อเกิดข้อผิดพลาด ODBC เฉพาะข้อมูลที่ถูกส่งไปตามกระบวนงานเหตุการณ์ข้อผิดพลาดคือ จำนวนแบบทั่วไปข้อผิดพลาด เช่น 3146 ซึ่งสอดคล้องกับข้อผิดพลาด: ODBC สายที่ไม่

สาเหตุ

แสดงข้อผิดพลาด ODBC ตามปกติประกอบด้วยสองคอมโพเนนต์ คอมโพเนนต์แรกเป็นข้อผิดพลาด 3146 จะมีคำอธิบาย:

โทร ODBC ล้มเหลว

ข้อผิดพลาดเซิร์ฟเวอร์เฉพาะข้อมูลที่มีอยู่ในคอมโพเนนต์ที่สอง ซึ่งคุณสามารถเรียกใช้ตัวเลขข้อผิดพลาดและคำอธิบายเช่น:

[Microsoft] [ODBC SQL Server โปรแกรมควบคุม] [SQL Server] <ข้อผิดพลาดของเซิร์ฟเวอร์ที่เฉพาะเจาะจง > (#<ข้อผิดพลาดจำนวน >)

ถ้าคุณตั้งค่าคุณสมบัติOnError ของฟอร์มการกระบวนงานเหตุการณ์ คุณสามารถพิมพ์ทับจำนวนคอมโพเนนต์แรกของข้อผิดพลาด แต่คุณไม่สามารถพิมพ์ทับจำนวนคอมโพเนนต์ที่สอง ข้อมูลเฉพาะของเซิร์ฟเวอร์ในส่วนสองของ ODBC ข้อผิดพลาดปรากฏบนหน้าจอหลังจากโค้ดได้เสร็จสิ้นการทำงานอยู่ เว้นแต่ว่าคุณรวมรายการต่อไปนี้ในเหตุการณ์ กระบวนงาน:

ตอบกลับ = acDataErrContinue

การแก้ปัญหา

หมายเหตุ: Microsoft แสดงตัวอย่างการเขียนโปรแกรมสำหรับภาพประกอบเท่านั้น โดยไม่มีการรับประกัน หรือโดยนัย ซึ่งรวม แต่จะไม่ถูกจำกัด การรับประกันโดยนัยของสินค้าหรือการออกกำลังกายสำหรับวัตถุประสงค์เฉพาะ บทความนี้สมมติว่า คุณคุ้นเคย กับภาษาการเขียนโปรแกรมที่จะแสดงรวมทั้ง และเครื่องมือที่ถูกใช้ เพื่อสร้าง และใช้บักขั้นตอน วิศวกรฝ่ายสนับสนุนของ Microsoft สามารถช่วยอธิบายฟังก์ชันการทำงานของกระบวนการเฉพาะ แต่จะไม่แก้ไขตัวอย่างเหล่านี้เมื่อต้องการเพิ่มฟังก์ชัน หรือสร้างขั้นตอนเพื่อให้ตรงกับความต้องการเฉพาะของคุณ

คุณสามารถสร้าง Microsoft Visual Basic สำหรับกระบวนงานแอปพลิเคชันที่ใช้ Data Access วัตถุ (DAO) เมื่อต้องการอัปเดRecordsetCloneที่ยึดตามฟอร์ม นี้ช่วยให้คุณเพื่อดักจับข้อผิดพลาดใด ๆ ที่คุณได้รับ

DAO ประกอบด้วยคอลเลกชันการข้อผิดพลาด ที่คุณสามารถใช้เพื่อดักจับข้อมูลเฉพาะของเซิร์ฟเวอร์ในส่วนสองของข้อผิดพลาด ODBC เมื่อเกิดข้อผิดพลาด ODBC คอมโพเนนต์แรกถูกเก็บไว้ในองค์ประกอบแรกของชุดข้อมูลข้อผิดพลาด และคอมโพเนนต์ที่สองจะถูกเก็บไว้ในองค์ประกอบสอง

ตัวอย่างในบทความนี้ใช้เหตุการณ์ก่อนการปรับปรุง แทนที่เป็นข้อผิดพลาด เหตุการณ์เพื่อดักจับข้อผิดพลาด ODBC เมื่อต้องการสร้างฟังก์ชันที่พิมพ์สีพื้นหน้าทับข้อผิดพลาด ODBC เฉพาะเมื่อเกิดเหตุการณ์ก่อนการปรับปรุง ของฟอร์ม ทำตามขั้นตอนเหล่านี้:

  1. สร้างฐานข้อมูลบนเดสก์ท็อปเปล่า

  2. ลิงก์ไปยังตาราง dbo_Accounts ในฐานข้อมูลตัวอย่าง AdventureWorks ใน Microsoft SQL Server

  3. ใช้ตัวช่วยสร้างฟอร์ม - เค้าโครงคอลัมน์เพื่อสร้างฟอร์มใหม่โดยยึดตามตารางบัญชีผู้ใช้

  4. บันทึกฟอร์มเป็น frmAccounts

  5. สร้างโมดูใหม่ จากนั้น พิมพ์รายการต่อไปนี้ในส่วนการประกาศถ้าบรรทัดนั้นไม่มี:

    ตัวเลือกแบบตายตัว

  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. ให้ตั้งค่าก่อนการปรับปรุง คุณสมบัติของฟอร์ม frmAccounts กระบวนงานเหตุการณ์ต่อไปนี้:

    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. เปิดฟอร์ม frmAccounts แล้วเพิ่มระเบียนใหม่ หรือแก้ไขระเบียน

    เมื่อคุณทำการเปลี่ยนแปลงระเบียน ระเบียนถูกบันทึกเมื่อคุณย้ายไปยังระเบียนที่แตกต่างกัน ถ้าเกิดข้อผิดพลาด ODBC คุณเห็นข้อความแบบกำหนดเองที่เป็นไปตามข้อผิดพลาดเซิร์ฟเวอร์ที่เฉพาะเจาะจง และทั่วไป "ODBC--เรียกล้มเหลว" ข้อความจนไม่

ขยายทักษะ Office ของคุณ
สำรวจการฝึกอบรม
รับฟีเจอร์ใหม่ก่อนใคร
เข้าร่วม Office Insider

ข้อมูลนี้เป็นประโยชน์หรือไม่

ขอบคุณสำหรับคำติชมของคุณ!

ขอขอบคุณสำหรับคำติชมของคุณ! เราคิดว่าอาจเป็นประโยชน์ที่จะให้คุณได้ติดต่อกับหนึ่งในตัวแทนฝ่ายสนับสนุน Office ของเรา

×