Não é possível interceptar erros ODBC específico na propriedade de AoOcorrerErro de um formulário (KB 206175)

Observação: Desejamos fornecer o conteúdo da Ajuda mais recente no seu idioma da forma mais rápida possível. Esta página foi traduzida de forma automatizada e pode conter imprecisões ou erros gramaticais. Nosso objetivo é que este conteúdo seja útil para você. As informações foram úteis? Dê sua opinião no final desta página. Aqui está o artigo em inglês para facilitar a referência.

Se você definir a propriedade AoOcorrerErro de um formulário do Access para um procedimento de evento, você não poderá recuperar a descrição de um erro ODBC esse procedimento e também não é possível interceptar um erro específico do ODBC. Quando ocorre um erro ODBC, a única informação que é passada para o procedimento de evento de erro é o número de um erro genérico, como 3146, que corresponde à mensagem de erro: Falha na chamada ODBC.

Causa

Mensagens de erro ODBC normalmente consistem em dois componentes. O primeiro componente é um erro 3146, cuja descrição é:

Falha na chamada ODBC

As informações de erro específicas do servidor estão contidas no segundo componente, do qual você pode recuperar um número de erro e uma descrição como:

[Microsoft] [ODBC do SQL Server Driver] [SQL Server] < mensagem de erro específico do servidor > (#< número erro >)

Se você definir a propriedade AoOcorrerErro de um formulário a um procedimento do evento, você pode interromper o número do primeiro componente do erro, mas você não pode ajustar o registro de número do segundo componente. As informações específicas do servidor na segunda parte do erro ODBC é exibida na tela após o código em execução, a menos que você inclua a seguinte linha em eventos procedimento:

Resposta = acDataErrContinue

Resolução

Observação: Microsoft fornece exemplos de programação somente para ilustração, sem garantia expressa ou implícita. Isso inclui, mas não está limitado a, as garantias de comercialização ou treino para um propósito específico. Este artigo pressupõe que você esteja familiarizado com a linguagem de programação que está sendo demonstrada e com as ferramentas que são usadas para criar e depurar procedimentos. Engenheiros de suporte da Microsoft podem ajudar a explicar a funcionalidade de um determinado procedimento, mas eles não irá modificar esses exemplos para fornecer funcionalidades adicionais ou construir procedimentos para atender às suas necessidades específicas.

Você pode criar um Microsoft Visual Basic para procedimento de aplicativos que usa objetos de acesso de dados (DAO) para atualizar um RecordsetClone que baseia-se no formulário. Isso permite interceptar qualquer mensagem de erro que você recebe.

DAO contém uma coleção de erros que você pode usar para controlar as informações específicas do servidor na segunda parte do erro ODBC. Quando ocorre um erro ODBC, o primeiro componente está armazenado no primeiro elemento da coleção de erros e o segundo componente está armazenado no segundo elemento.

O exemplo neste artigo usa o evento BeforeUpdate em vez do evento Error para interceptar erros específicos do ODBC. Para criar uma função que armadilhas erros específicos de ODBC quando ocorre o evento BeforeUpdate de um formulário, siga estas etapas:

  1. Crie um banco de dados da área de trabalho em branco.

  2. Link para a tabela dbo_Accounts no banco de dados de amostra AdventureWorks no Microsoft SQL Server.

  3. Use o Assistente de formulário - layout de colunas para criar um novo formulário baseado na tabela contas.

  4. Salve o formulário como frmAccounts.

  5. Criar um novo módulo e digite a seguinte linha na seção de declarações se essa linha não ainda estiver lá:

    Opção explícita

  6. Digite ou cole o procedimento a seguir no 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. Salve o módulo com um nome exclusivo e feche a janela de módulo.

  8. Defina a propriedade AntesDeAtualizar do formulário frmAccounts para o seguinte procedimento 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. No menu Depurar, clique em Compilar < nome do banco de dados >

  10. Se nenhum erro ocorrer, salve o formulário.

  11. Abra o formulário de frmAccounts e, em seguida, adicione um novo registro ou editar um registro.

    Quando fizer uma alteração em um registro, o registro é salvo quando você move para outro registro. Se ocorrer um erro ODBC, você vir a mensagem personalizada que baseia-se do erro específico do servidor, e o genérico "ODBC – falha na chamada" mensagem está preso.

Expanda suas habilidades no Office
Explore o treinamento
Obtenha novos recursos primeiro
Ingressar no Office Insider

Essas informações foram úteis?

Obrigado por seus comentários!

Agradecemos pelos seus comentários! Parece que pode ser útil conectar você a um de nossos agentes de suporte do Office.

×