No se puede interceptar errores ODBC específico en AlOcurrirError propiedad de un formulario (KB 206175)

Nota: Nos gustaría proporcionarle el contenido de ayuda actual lo más rápido posible en su idioma. Esta página se ha traducido mediante un sistema automático y es posible que contenga imprecisiones o errores gramaticales. Nuestro objetivo es que este contenido sea útil para usted. ¿Puede informarnos sobre si la información le ha sido útil al final de la página? Aquí tiene el artículo en inglés para que pueda consultarlo fácilmente.

Si establece la propiedad AlOcurrirError de un formulario de Access a un procedimiento de evento, no se puede recuperar la descripción de un error ODBC en dicho procedimiento, y también no puede capturar un error ODBC específico. Cuando se produce un error ODBC, la única información que se pasa al procedimiento de evento Error es el número de un error genérico, como 3146, que corresponde al mensaje de error: error de llamada de ODBC.

Causa

Mensajes de error ODBC normalmente constan de dos componentes. El primer componente es error 3146, cuya descripción es:

Error de llamada de ODBC

La información de error específico del servidor se encuentra en el segundo componente, desde donde puede recuperar un número de error y una descripción como:

[Microsoft] [ODBC SQL Server Driver] [SQL Server] < mensaje de error específico del servidor > (#< número de error >)

Si establece la propiedad AlOcurrirError de un formulario a un procedimiento de evento, puede reventar al número del primer componente del error, pero no puede capturar al número del segundo componente. La información específica del servidor en la segunda parte del error ODBC aparece en la pantalla después de que el código ha terminado de ejecutar, a menos que incluya la línea siguiente en el evento procedimiento:

Respuesta = acDataErrContinue

Solución

Nota: Microsoft proporciona ejemplos de programación fines ilustrativos únicamente, sin ninguna garantía tanto expresa como implícita. Esto incluye, pero no se limita a las garantías de comerciabilidad o idoneidad para un propósito particular. En este artículo se supone que está familiarizado con el lenguaje de programación que se muestra y con las herramientas que se usan para crear y depurar procedimientos. Los ingenieros de soporte técnico de Microsoft pueden ayudar a explicar la funcionalidad de un determinado procedimiento, pero no modificarán estos ejemplos para ofrecer mayor funcionalidad o crear procedimientos para satisfacer necesidades específicas.

Puede crear una Microsoft Visual Basic para aplicaciones que usa objetos de acceso a datos (DAO) para actualizar RecordsetClone que se basa en el formulario. Esto le permite capturar cualquier mensaje de error que recibe.

DAO contiene una colección de errores que puede utilizar para capturar la información específica del servidor en la segunda parte del error ODBC. Cuando se produce un error ODBC, el primer componente se almacena en el primer elemento de la colección de errores y el segundo componente se almacena en el segundo elemento.

El ejemplo en este artículo, utiliza el evento BeforeUpdate en lugar del evento de Error interceptar errores específicos de ODBC. Para crear una función que capturas errores específicos de ODBC cuando se produce el evento BeforeUpdate de un formulario, siga estos pasos:

  1. Crear una base de datos de escritorio en blanco.

  2. Vínculo a la tabla dbo_Accounts en la base de datos de ejemplo AdventureWorks en Microsoft SQL Server.

  3. Utilice al Asistente de formulario - diseño en columnas para crear un nuevo formulario basado en la tabla de cuentas.

  4. Guarde el formulario como frmAccounts.

  5. Cree un nuevo módulo y, a continuación, escriba la línea siguiente en la sección Declaraciones si dicha línea no está ya allí:

    Option Explicit

  6. Escriba o pegue el siguiente procedimiento en el módulo:

    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. Guarde el módulo con un nombre único y cierre la ventana del módulo.

  8. Establecer la propiedad AntesDeActualizar del formulario frmAccounts en el siguiente procedimiento de evento:

    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. En el menú Depurar, haga clic en Compilar < nombre de la base de datos >

  10. Si no se producen errores, guarde el formulario.

  11. Abra el formulario frmAccounts y agregar un nuevo registro o editar un registro.

    Cuando realiza un cambio en un registro, el registro se guardará cuando se mueve a otro registro. Si se produce un error ODBC, verá el mensaje personalizado que se basa en el error específico del servidor, y el genérico "ODBC: error en la llamada" se captura el mensaje.

Ampliar sus conocimientos de Office
Explorar los cursos
Obtener nuevas características primero
Únase a los participantes de Office Insider

¿Le ha sido útil esta información?

¡Gracias por sus comentarios!

Gracias por sus comentarios. Quizá le interese ponerse en contacto con uno de nuestros agentes de soporte de Office.

×