Σημείωση: Θέλουμε να σας παρέχουμε το πιο πρόσφατο περιεχόμενο βοήθειας στη γλώσσα σας όσο πιο σύντομα γίνεται. Αυτή η σελίδα έχω μεταφραστεί μέσω αυτοματοποιημένης διαδικασίας και ενδεχομένως να περιέχει γραμματικά λάθη και ανακρίβειες. Ο σκοπός μας είναι αυτό το περιεχόμενο να σας φανεί χρήσιμο. Μπορείτε να μας ενημερώσετε στο κάτω μέρος αυτής της σελίδας εάν οι πληροφορίες σάς φάνηκαν χρήσιμες; Εδώ θα βρείτε το άρθρο στα Αγγλικά, για να το συμβουλεύεστε εύκολα.
Εάν ορίσετε την ιδιότητα OnError μιας φόρμας της Access σε μια διαδικασία συμβάντος, δεν μπορείτε να ανακτήσετε την περιγραφή ενός σφάλματος ODBC σε αυτήν τη διαδικασία και επίσης δεν μπορείτε να εντοπίσετε ένα συγκεκριμένο σφάλμα ODBC. Όταν παρουσιάζεται σφάλμα ODBC, η μοναδική πληροφορία που μεταβιβάζεται στη διαδικασία συμβάντος σφάλματος είναι ο αριθμός των ένα γενικό σφάλμα, όπως 3146, που αντιστοιχεί σε το μήνυμα σφάλματος: Απέτυχε η κλήση ODBC.
Αιτία
Μηνύματα σφάλματος ODBC κανονικά αποτελούνται από δύο στοιχεία. Το πρώτο στοιχείο είναι σφάλμα 3146, του οποίου την περιγραφή είναι:
Απέτυχε η κλήση ODBC
Τις πληροφορίες που αφορούν το διακομιστή σφάλματος που περιέχεται στο δεύτερο στοιχείο, από την οποία μπορείτε να ανακτήσετε έναν αριθμό σφάλματος και μια περιγραφή, όπως:
[Microsoft] [Πρόγραμμα οδήγησης ODBC SQL Server] [SQL Server] < μήνυμα σφάλματος που αφορούν το διακομιστή > (#< αριθμός σφάλματος >)
Εάν ορίσετε την ιδιότητα OnError μιας φόρμας σε διαδικασία συμβάντος, μπορείτε να εντοπίσετε τον αριθμό του πρώτου στοιχείου του σφάλματος, αλλά δεν είναι δυνατό να εντοπίσετε τον αριθμό των το δεύτερο στοιχείο. Οι πληροφορίες που αφορούν το διακομιστή στο δεύτερο τμήμα του σφάλματος ODBC εμφανίζεται στην οθόνη μετά την ολοκλήρωση του κώδικα περιλαμβάνει εκτελείται, εκτός εάν συμπεριλάβετε την ακόλουθη γραμμή συμβάντων διαδικασία:
Απόκριση = acDataErrContinue
Ανάλυση
Σημείωση: Η Microsoft παρέχει παραδείγματα προγραμματισμού μόνο για επεξήγηση, χωρίς καμία εγγύηση ρητή ή έμμεση. Αυτό περιλαμβάνει, αλλά δεν είναι ενδεικτικά, οι σιωπηρή εγγυήσεις εμπορευσιμότητας ή καταλληλότητας για συγκεκριμένο σκοπό. Σε αυτό το άρθρο προϋποθέτει ότι είστε εξοικειωμένοι με τη γλώσσα προγραμματισμού που παρουσιάζεται, καθώς και με τα εργαλεία που χρησιμοποιούνται για τη δημιουργία και τον εντοπισμό σφαλμάτων διαδικασίες. Οι μηχανικοί υποστήριξης της Microsoft μπορεί να σας βοηθήσει να εξηγήσετε τη λειτουργικότητα μιας συγκεκριμένης διαδικασίας, αλλά δεν θα τροποποιήσουν αυτά τα παραδείγματα για να παρέχουν πρόσθετες λειτουργίες ή να δημιουργήσουν διαδικασίες για να πληρούν τις συγκεκριμένες απαιτήσεις σας.
Μπορείτε να δημιουργήσετε ένα Microsoft Visual Basic for Applications διαδικασία που χρησιμοποιεί αντικείμενα πρόσβασης δεδομένων (DAO) για να ενημερώσετε μια RecordsetClone που βασίζεται στη φόρμα. Αυτό σας επιτρέπει να εντοπίσετε οποιοδήποτε μήνυμα σφάλματος που λαμβάνετε.
DAO περιλαμβάνει μια συλλογή σφάλματα που μπορείτε να χρησιμοποιήσετε για να εντοπίσετε τις πληροφορίες που αφορούν το διακομιστή στο δεύτερο τμήμα του σφάλματος ODBC. Όταν παρουσιάζεται σφάλμα ODBC, το πρώτο στοιχείο είναι αποθηκευμένο στο πρώτο στοιχείο της συλλογής σφαλμάτων και το δεύτερο στοιχείο είναι αποθηκευμένο στο δεύτερο στοιχείο.
Το παράδειγμα σε αυτό το άρθρο χρησιμοποιεί το συμβάν πριν από ενημέρωση αντί για το συμβάν σφάλματος για να εντοπίσετε συγκεκριμένα σφάλματα ODBC. Για να δημιουργήσετε μια συνάρτηση που παγιδεύει συγκεκριμένα σφάλματα ODBC, όταν εμφανίζεται το συμβάν πριν από ενημέρωση μιας φόρμας, ακολουθήστε τα παρακάτω βήματα:
-
Δημιουργήστε μια κενή βάση δεδομένων υπολογιστή.
-
Σύνδεση με τον πίνακα dbo_Accounts στο το δείγμα βάσης δεδομένων AdventureWorks στο Microsoft SQL Server.
-
Χρησιμοποιήστε τον Οδηγό φορμών - διάταξη στηλών για να δημιουργήσετε μια νέα φόρμα που βασίζεται στον πίνακα λογαριασμών.
-
Αποθηκεύστε τη φόρμα ως frmAccounts.
-
Δημιουργήστε μια νέα λειτουργική μονάδα και, στη συνέχεια, πληκτρολογήστε την ακόλουθη γραμμή στην ενότητα δηλώσεων Εάν αυτήν τη γραμμή δεν υπάρχει ήδη:
Option Explicit
-
Πληκτρολογήστε ή επικολλήστε την ακόλουθη διαδικασία στη λειτουργική μονάδα:
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
-
Αποθηκεύστε τη λειτουργική μονάδα με ένα μοναδικό όνομα και κλείστε το παράθυρο της λειτουργικής μονάδας.
-
Ορίστε την ιδιότητα πριν από ενημέρωση της φόρμας 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
-
Στο μενού Εντοπισμός σφαλμάτων, κάντε κλικ στην επιλογή μεταγλώττιση < όνομα της βάσης δεδομένων >
-
Εάν δεν παρουσιαστούν σφάλματα, αποθηκεύστε τη φόρμα.
-
Ανοίξτε τη φόρμα frmAccounts, και, στη συνέχεια, προσθέστε μια νέα εγγραφή ή επεξεργαστείτε μια εγγραφή.
Όταν κάνετε μια αλλαγή σε μια εγγραφή, η εγγραφή αποθηκεύεται κατά τη μετακίνηση σε μια άλλη εγγραφή. Εάν προκύψει σφάλμα ODBC, δείτε το προσαρμοσμένο μήνυμα που βασίζεται σε το σφάλμα που αφορούν το διακομιστή, και το γενικό "ODBC--η κλήση απέτυχε" εφαρμόζεται παγίδευση μήνυμα.