MS Access VBA перехватывает ошибку подключения к SQL Server

У меня возникли проблемы с доступом (2010) VBA для перехвата ошибок при подключении к SQL Server (2008) для связывания таблиц.

Я получаю сообщение об ошибке и всплывающие окна, предположительно из-за драйвера ODBC? Я хочу подавить их и обработать ошибку самостоятельно. Я знаю о коллекциях DAO.errors и ADO.errors, но они не помогают, если я не могу заставить ошибку вызвать мой обработчик ошибок!

Приведенный ниже код выдаст ошибку (если только у вас нет таблицы с именем myTable в базе данных с именем myDatabase на сервере с именем myServer). Я пытался использовать ADODB, а не DAO, но вообще не смог заставить это работать. Любые идеи?

Public Function main()
    Dim myDB As DAO.Database
    Dim myTabledef As DAO.TableDef

    On Error GoTo Err_handler

    Set myDB = CurrentDb
    Set myTabledef = myDB.CreateTableDef("l_table")

    DoCmd.SetWarnings False

    myTabledef.Connect = "odbc;driver=SqLServer;" & _
        "DATABASE=myDB;SERVER=myServer;Trusted_Connection=Yes;"

    myTabledef.SourceTableName = "MyTable"

    myDB.TableDefs.Append myTabledef

    DoCmd.SetWarnings True

    Exit Function

Err_handler:
    MsgBox Err.Number & " - " & Err.Description

End Function

Я сделал ошибку в опубликованном коде {Sql Server} стал SqLServer, когда я его опубликовал. Итак, полный код, который дает ошибку, приведен ниже:

Public Function main()
Dim myDB As DAO.Database
Dim myTabledef As DAO.TableDef

On Error GoTo Err_handler

Set myDB = CurrentDb
Set myTabledef = myDB.CreateTableDef("l_table")

DoCmd.SetWarnings False

myTabledef.Connect = "odbc;driver={Sql Server};" & _
    "DATABASE=myDB;SERVER=myServer;Trusted_Connection=Yes;"

myTabledef.SourceTableName = "MyTable"

myDB.TableDefs.Append myTabledef

DoCmd.SetWarnings True

Exit Function

Err_handler:
MsgBox Err.Number & " - " & Err.Description

End Function

person Kjay    schedule 04.02.2012    source источник
comment
Если я правильно понимаю вопрос, простым способом было бы создать общую подсистему обработки ошибок, которая использует оператор select для номера ошибки для обработки возникающих ошибок, вы также можете регистрировать ошибки см. здесь по сути, метка/блок Err_handler: будет вызывать эту процедуру, передавая любые аргументы и т. д., однако это зависит от того, вызывается ли она on error goto   -  person T I    schedule 04.02.2012


Ответы (1)


Ошибка не возникнет, пока вы не попытаетесь добавить TableDef

Dim myDB As DAO.Database
Dim myTabledef As DAO.TableDef

On Error GoTo Err_handler

Set myDB = CurrentDb
scn = "odbc;driver=SqLServer;" & _
"DATABASE=myDB;SERVER=myServer;Trusted_Connection=Yes;"
Set myTabledef = myDB.CreateTableDef("l_table")

myTabledef.Connect = scn
myTabledef.SourceTableName = "Table1"
myDB.TableDefs.Append myTabledef

Err_handler:
Debug.Print Err.Number & " " & Err.Description
person Fionnuala    schedule 04.02.2012
comment
Да все верно. Но когда ошибка возникает, я хочу обработать ее в своем коде обработки ошибок, а не иметь несколько всплывающих окон из ODBC (или откуда-то еще). Ошибки также могут возникнуть, если я потеряю соединение с удаленной базой данных после запуска программы. Затем всплывающие окна могут затруднить пользователям закрытие приложения, поскольку они продолжают появляться снова. - person Kjay; 08.02.2012
comment
Я не уверен, что понимаю тебя. Образец кода передается обработчику ошибок в строке, в которой произошел сбой, и в этот момент его можно обработать любым подходящим способом. - person Fionnuala; 08.02.2012
comment
@Fionnuala, у меня есть переход при ошибке, но диалог, который упоминает Кджей, кажется, переопределяет это, и даже DoCmd.SetWarnings False - person bf2020; 22.01.2021