Как лучше всего использовать VBA в Access или Excel для проверки соединения ODBC? - PullRequest
1 голос
/ 11 марта 2009

Учитывая предварительно сконфигурированный системный DSN ODBC, я хотел бы написать функцию, которая изящно проверяет это соединение, используя VBA.

Private Function TestConnection(ByVal dsnName As String) As Boolean

    ' What goes here?? '

End Function

Изменить. Чтобы уточнить, системные уведомления о доставке указывают на внешние базы данных SQL Server 2005 с аутентификацией Windows NT.

Один из подходов, которые я попробовал, - отправить случайный запрос в целевую базу данных и отловить ошибку. Если запрос работает, верните true. Если есть ошибка, верните false. Это работает просто отлично, но кажется ... грязным. Есть ли более элегантный способ, особенно тот, который не зависит от On Error Goto ?

Примечание. Это устаревшая база данных Access 2000, над которой я работаю, поэтому ни одно решение не может иметь никаких зависимостей Access 2007 или 2003. Я хотел бы сделать его общим для VBA, но если есть и простой способ в Access, он тоже подойдет.

Большое спасибо за любые советы.

Ответы [ 4 ]

5 голосов
/ 11 марта 2009

Dim cnn As ADODB.Connection
Dim canConnect as Boolean
Set cnn = New ADODB.Connection

cnn.Open "DSN HERE"
If cnn.State = adStateOpen Then
    canConnect = True
    cnn.Close
End If

Msgbox canConnect

РЕДАКТИРОВАТЬ: формат DSN может быть "DSN = MyDSN; UID = myuser; PWD = myPwd;"
Посмотрите это для строк подключения

2 голосов
/ 24 августа 2012

Я слишком поздно, чтобы дать вам полезный ответ на ваш вопрос, но я пришел сюда , потому что я хотел посмотреть, есть ли у StaCkOverflow лучший ответ, чем код, который я сейчас использую для тестирования ADODB соединения.

... Оказывается, ответ «Нет», поэтому я выложу код для справки: кто-то найдет его полезным.

Замечания по кодированию: это не общий ответ: это метод из класса, инкапсулирующий объект ADODB.Connection, и он предполагает существование объекта 'm_objConnect'.

TestConnection: метод класса VBA для публикации отладочной информации для объекта ADODB.Connection

Это распечатывает строку соединения, текущее состояние, список ошибок ADODB (если есть) и полный список именованных свойств соединения.


Public Sub TestConnection()
On Error GoTo ErrTest

Dim i As Integer

If m_objConnect Is Nothing Then

Debug.Print "Object 'm_objConnect' not instantiated."

прочее

Debug.Print m_objConnect.ConnectionString
Debug.Print "Connection state = " & ObjectStateString(m_objConnect.State)

Debug.Print

If m_objConnect.Errors.Count > 0 Then
    Debug.Print "ADODB ERRORS (" & m_objConnect.Errors.Count & "):"
    For i = 0 To m_objConnect.Errors.Count
        With m_objConnect.Errors(i)
            Debug.Print vbTab & i & ":"  _ 
                      & vbTab & .Source & " Error " & .Number & ": " _ 
                      & vbTab & .Description & " " _ 
                      & vbTab & "(SQL state = " & .SqlState & ")"
        End With
    Next i
End If

Debug.Print

Debug.Print "CONNECTION PROPERTIES (" & m_objConnect.Properties.Count & "):"
For i = 0 To m_objConnect.Properties.Count - 1
    Debug.Print vbTab & i & ":" _ 
              & vbTab & m_objConnect.Properties(i).Name & " = " _ 
              & vbTab & m_objConnect.Properties(i).Value
Next i

End If

ExitTest: Exit Sub ErrTest: Debug.Print "Ошибка" & Err.Number & "поднято" & Err.Source & ":" & Err.Description Резюме Далее

End Sub

Частная функция ObjectStateString (ObjectState As ADODB.ObjectStateEnum) As String

Выберите Case ObjectState Дело ADODB.ObjectStateEnum.adStateClosed ObjectStateString = "Закрыто" Дело ADODB.ObjectStateEnum.adStateConnecting ObjectStateString = "Соединение" Дело ADODB.ObjectStateEnum.adStateExecuting ObjectStateString = "Выполнение" Дело ADODB.ObjectStateEnum.adStateFetching ObjectStateString = "Извлечение" Дело ADODB.ObjectStateEnum.adStateOpen ObjectStateString = "Открыть" Дело остальное ObjectStateString = "State" & CLng (ObjectState) & ": неизвестный номер состояния" Выбор конца

Функция завершения

Делитесь и наслаждайтесь: и следите за переносами строк, которые будут вставлены там, где они будут нарушать код вашего браузера (или с помощью функций форматирования StackOverflow).

0 голосов
/ 02 декабря 2014

Если вам просто нужно проверить, что сервер базы данных действительно доступен, это можно сделать, несмотря на то, что здесь говорится, что это невозможно.

В этом случае вы можете попытаться открыть TCP-соединение с конкретным сервером и портом. Например, экземпляр SQL Server по умолчанию прослушивает TCP-порт 1433. Попытка простого TCP-соединения в VBA покажет вам, успешно это или нет. Только если это успешно, я запросил бы, используя соединение ODBC.

Это намного более изящно и эффективно. Это удалит любую "грубую" ошибку из вашего кода теста ODBC. Однако, как я уже сказал, это применимо только в том случае, если вам нужно проверить наличие или наличие экземпляра сервера базы данных.

0 голосов
/ 11 марта 2009

Там нет магической функции, которая будет проверять это без фактического подключения и попытки выполнения операции.

Если вам не нравится случайная часть запроса - вы можете запросить системные таблицы

для доступа

SELECT TOP 1 NAME FROM MSysObjects 

Для SQL Server

SELECT TOP 1 NAME FROM sysobjects 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...