Ошибки ADO

Область применения: Access 2013, Office 2013

Ошибки ADO сообщаются вашей программе как ошибки времени выполнения. Для их перехвата и обработки можно использовать механизм перехвата ошибок языка программирования. Например, в Visual Basic используйте инструкцию On Error . В Visual J++ используйте блок try-catch . В Visual C++ это зависит от метода, используемого для доступа к библиотекам ADO. В #import используйте блок try-catch . В противном случае программистам C++ необходимо явно получить объект ошибки, вызвав Метод GetErrorInfo. Следующая вложенная процедура Visual Basic демонстрирует перехват ошибки ADO:

 
' BeginErrorHandlingVB01 
Private Sub Form_Load() 
 ' Turn on error handling 
 On Error GoTo FormLoadError 
 
 'Open the database and the recordset for processing. 
 ' 
 Dim strCnn As String 
 strCnn = "Provider='sqloledb';" & _ 
 "Data Source='MySqlServer';" & _ 
 "Initial Catalog='Northwind';Integrated Security='SSPI';" 
 
 ' cnn is a Public Connection Object because 
 ' it was defined WithEvents 
 Set cnn = New ADODB.Connection 
 cnn.Open strCnn 
 
 ' The next line of code intentionally causes 
 ' an error by trying to open a connection 
 ' that has already been opened. 
 cnn.Open strCnn 
 
 ' rst is a Public Recordset because it 
 ' was defined WithEvents 
 Set rst = New ADODB.Recordset 
 rst.Open "Customers", cnn 
 
 Exit Sub 
 
' Error handler 
FormLoadError: 
 Dim strErr As String 
 Select Case Err 
 Case adErrObjectOpen 
 strErr = "Error #" & Err.Number & ": " & Err.Description & vbCrLf 
 strErr = strErr & "Error reported by: " & Err.Source & vbCrLf 
 strErr = strErr & "Help File: " & Err.HelpFile & vbCrLf 
 strErr = strErr & "Topic ID: " & Err.HelpContext 
 MsgBox strErr 
 Debug.Print strErr 
 Err.Clear 
 Resume Next 
 ' If some other error occurs that 
 ' has nothing to do with ADO, show 
 ' the number and description and exit. 
 Case Else 
 strErr = "Error #" & Err.Number & ": " & Err.Description & vbCrLf 
 MsgBox strErr 
 Debug.Print strErr 
 Unload Me 
 End Select 
End Sub 
' EndErrorHandlingVB01 

Эта процедура события Form_Load намеренно создает ошибку, пытаясь дважды открыть один и тот же объект Connection . При втором вызове метода Open активируется обработчик ошибок. В этом случае ошибка имеет тип adErrObjectOpen, поэтому обработчик ошибок отображает следующее сообщение перед возобновлением выполнения программы:

Error #3705: Operation is not allowed when the object is open. 
Error reported by: ADODB.Connection 
Help File: E:\WINNT\HELP\ADO260.CHM Topic ID: 1003705 

Сообщение об ошибке содержит все сведения, предоставляемые объектом Err Visual Basic, за исключением значения LastDLLError , которое здесь не применяется. Номер ошибки указывает, какая ошибка произошла. Описание полезно в тех случаях, когда вы не хотите самостоятельно обрабатывать ошибку. Вы можете просто передать его пользователю. Хотя обычно требуется использовать сообщения, настроенные для приложения, вы не можете предвидеть каждую ошибку. описание дает некоторую подсказку о том, что пошло не так. В примере кода объект Connection сообщил об ошибке. Здесь вы увидите тип или программный идентификатор объекта, а не имя переменной.

Примечание.

Объект Err Visual Basic содержит только сведения о последней ошибке. Коллекция ADO Errors объекта Connection содержит по одному объекту Error для каждой ошибки, вызванной последней операцией ADO. Используйте коллекцию Errors вместо объекта Err для обработки нескольких ошибок. Дополнительные сведения о коллекции Errors см. в разделе Ошибки поставщика. Однако если нет допустимого объекта Connection , объект Err является единственным источником сведений об ошибках ADO.

Какие типы операций могут привести к ошибкам ADO? Распространенные ошибки ADO могут включать открытие объекта, например Connection или Recordset, попытку обновить данные или вызов метода или свойства, которые не поддерживаются поставщиком.

Ошибки OLE DB также можно передать в приложение как ошибки времени выполнения в коллекции Errors . Дополнительные сведения о номерах ошибок OLE DB см. в главе 16 справочника по программистам OLE DB.