Ne morete pasti določene ODBC napake v NaNapaki lastnosti obrazca (KB 206175)

Opomba: Najnovejšo vsebino pomoči v vašem jeziku vam želimo zagotoviti v najkrajšem možnem času. Ta stran je bila prevedena z avtomatizacijo in lahko vsebuje slovnične napake ali nepravilnosti. Naš namen je, da bi bila vsebina za vas uporabna. Ali nam lahko na dnu te strani sporočite, ali so bile informacije za vas uporabne? Tukaj je angleški članek za preprosto referenco.

Če ste nastavili lastnost NaNapaki Accessovega obrazca na dogodkovna procedura, ne more pridobiti opis ODBC napake v tem postopku in jih ni mogoče tudi pasti določene napake ODBC. Ko pride do napake ODBC, le informacije, ki je bila vnesena na napako dogodkovna procedura je število splošne napake, na primer 3146, ki ustreza sporočilo o napaki: ODBC-klic ni bila uspešna.

Vzrok

ODBC sporočila o napakah po navadi sestavljena iz dveh delov. Prvi del je napaka 3146, katerih opis je:

ODBC – klic ni uspel

Napaka strežnika določene informacije so vključene v druge komponente, ki ga lahko dobite številka napake in opis kot:

[Microsoft] [Gonilnika ODBC SQL Server] [Strežnika SQL Server] < značilne za strežnik sporočilo o napaki > (#< številka napake >)

Če ste nastavili lastnost NaNapaki obrazca na dogodkovna procedura, lahko pasti številka prve komponente napake, vendar ne morete pasti številne druge komponente. Informacije značilne za strežnik v drugem delu ODBC napaka se prikaže na zaslonu, ko kodo končano, operacijski sistem, razen če to vrstico v primeru postopek:

Odgovor = acDataErrContinue

Ločljivost

Opomba: Microsoft ponuja primere za programiranje le za ponazoritev, brez izrecnega ali implicitnega. To vključuje, vendar ni omejena na implicitnimi primernosti ali za posebne namene. V tem članku je predvideno, da ste seznanjeni z programski jezik, ki je primer in orodij, ki se uporabljajo za ustvarjanje in postopki za iskanje napak. Inženirji za podporo Microsoft lahko pomagajo pojasniti funkcionalnost posameznega postopka, vendar ne bodo spreminjali primerov, da bi zagotovili dodatno funkcionalnost ali ustvarjate postopki, ki izpolnjujejo vaše zahteve.

Ustvarite lahko Microsoft Visual Basic for Applications postopek, ki uporablja Data Access Objects (DAO) za posodobitev RecordsetClone , ki temelji na obrazcu. To vam omogoča, da pasti sporočilo o napaki, ki jih prejmete.

DAO vsebuje napake zbirke, ki jih lahko uporabite za odkrivanje informacije značilne za strežnik v drugem delu napaka ODBC. Ko pride do napake ODBC, prvi element, ki je shranjena v prvi element zbirke napak in druge komponente, ki je shranjena v drugi element.

Primer v tem članku uporablja dogodek BeforeUpdate namesto napako dogodek za odkrivanje morebitne napake ODBC. Če želite ustvariti funkcije, ki pasti ODBC morebitne napake, ko se pojavi dogodek BeforeUpdate obrazca, sledite tem korakom:

  1. Ustvarjanje prazna namizna zbirka podatkov.

  2. Povezava do dbo_Accounts tabele v vzorčno zbirko podatkov AdventureWorks v Microsoft SQL Server.

  3. Uporabite čarovnika za obrazce – stolpci postavitve za ustvarjanje novega obrazca, ki temelji na tabeli računi.

  4. Shranite obrazec kot frmAccounts.

  5. Ustvarite nov modul, in nato vnesite to vrstico v odsek» Declarations« , če ta vrstica še ni na voljo:

    Option Explicit

  6. Vnesite ali prilepite ta postopek v modulu:

    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. Shranite modul z enolično ime in zaprite okno modul.

  8. Nastavite lastnost BeforeUpdate frmAccounts obrazca na naslednji dogodek postopek:

    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. Odpravljanje napak v meniju kliknite zbrati < ime zbirke podatkov >

  10. Če pride do napake, shranite obrazec.

  11. Odprite obrazec, frmAccounts, in nato Dodaj nov zapis ali urejanje zapisa.

    Ko spremenite zapis, zapis shranjeni, ko se premaknete na drug zapis. Če pride do napake ODBC, opazite sporočilo po meri, ki temelji na strežniku značilne napake, in na splošno »ODBC – klic ni uspel« je ujet sporočilo.

Razširite poznavanje Officea
Oglejte si izobraževanje
Prvi dobite nove funkcije
Pridružite se programu Office Insider

Vam je bila informacija v pomoč?

Zahvaljujemo se vam za povratne informacije.

Zahvaljujemo se vam za povratne informacije. Videti je, da bi vam prišla prav pomoč enega od naših Officeovih agentov za podporo.

×