Nota: Queremos fornecer-lhe os conteúdos de ajuda mais recentes o mais rapidamente possível e no seu idioma. Esta página foi traduzida automaticamente e pode conter erros gramaticais ou imprecisões. O nosso objetivo é que estes conteúdos lhe sejam úteis. Pode informar-nos se as informações foram úteis no final desta página? Eis o artigo em inglês para referência.
Se definir a propriedade AoOcorrerErro de um formulário do Access para um procedimento de evento, não é possível obter a descrição de um erro ODBC nesse procedimento e também é possível intercetar um erro específico do ODBC. Quando ocorre um erro ODBC, a única informação que lhe é transmitida o procedimento de evento erro é o número de um erro genérico, tal como 3146, que corresponde à mensagem de erro: falha de chamada de ODBC.
Causa
Mensagens de erro ODBC normalmente de consistir em dois componentes. O primeiro componente é erro 3146, cuja descrição é:
Ocorreu uma falha de chamada de ODBC
As informações de erro específicas do servidor estão contidas na segunda componente, a partir do qual a poderá obter um número de erro e uma descrição, como:
[Microsoft] [Controlador ODBC SQL Server] [Do SQL Server] < mensagem de erro específicas do servidor > (#< número do erro >)
Se definir a propriedade AoOcorrerErro de um formulário para um procedimento de evento, pode intercetar o número do primeiro componente do erro, mas não é possível intercetar o número do segundo componente. As informações específicas do servidor na segunda parte do erro ODBC é apresentada no ecrã após o código de ter sido concluído em execução, a menos que inclua a linha seguinte de evento procedimento:
Resposta = acDataErrContinue
Resolução
Nota: Microsoft fornece exemplos de programação ilustração apenas, sem garantias expressa ou implícita. Isto inclui, mas não está limitado a garantias implícitas de comercialização ou de manutenção física para um objetivo específico. Este artigo assume que está familiarizado com a linguagem de programação que está a ser demonstrada e com as ferramentas que são utilizadas para criar e depurar procedimentos. Engenheiros de suporte da Microsoft podem ajudar a explicar a funcionalidade de um determinado procedimento, mas não irão modificar estes exemplos para fornecer funcionalidades adicionais ou construir procedimentos para aos seus requisitos específicos.
Pode criar um Microsoft Visual Basic para procedimento de aplicações que utiliza Data Access Objects (DAO) para atualizar RecordsetClone baseado no formulário. Esta opção permite-lhe intercetar qualquer mensagem de erro que recebe.
DAO contém uma coleção de erros que pode utilizar para intercetar as informações específicas do servidor na segunda parte do erro ODBC. Quando ocorre um erro ODBC, o primeiro componente é armazenado no primeiro elemento da coleção de erros e o segundo componente está armazenado no elemento de segundo.
O exemplo neste artigo utiliza o evento AntesDeActualizar em vez do evento de erro para intercetar erros ODBC específicos. Para criar uma função que traps erros ODBC específicos quando ocorre o evento AntesDeActualizar de um formulário, siga estes passos:
-
Crie uma base de dados de ambiente de trabalho em branco.
-
Ligação para a tabela dbo_Accounts na base de dados de exemplo AdventureWorks no Microsoft SQL Server.
-
Utilize o Assistente de formulários - colunas esquema para criar um novo formulário baseado na tabela contas.
-
Guarde o formulário como frmAccounts.
-
Crie um novo módulo e, em seguida, escreva a linha seguinte na secção de declarações se nessa linha não estiver já lá:
Opção explícita
-
Escreva ou cole o seguinte procedimento para o 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
-
Guarde o módulo com um nome exclusivo e feche a janela do módulo.
-
Defina a propriedade de AntesDeActualizar do formulário frmAccounts com 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
-
No menu Depurar, clique em Compilar < nome da base de dados >
-
Se não ocorre nenhum erro, guarde o formulário.
-
Abrir o formulário de frmAccounts e, em seguida, adicionar um novo registo ou editar um registo.
Quando fizer uma alteração a um registo, o registo é guardado quando mover para um registo diferente. Se ocorre um erro ODBC, verá a mensagem personalizada que é baseada no erro específicas do servidor, e o genérico "ODBC--chamada falhou" mensagem se encontre oculto.