2009-03-10 1 views
1

Учитывая предварительно сконфигурированную систему DSD системы ODBC, я хотел бы написать функцию, которая изящно проверит, что соединение с использованием VBA.Как лучше всего использовать VBA в Access или Excel для тестирования соединения ODBC?

Private Function TestConnection(ByVal dsnName As String) As Boolean 

    ' What goes here?? ' 

End Function 

Edit: Для того, чтобы уточнить, что система DSNs указывают на внешние SQL Server 2005 базы данных, с помощью проверки подлинности Windows NT.

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

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

Большая обязанность за любой совет.

ответ

0

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

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

Для доступа

SELECT TOP 1 NAME FROM MSysObjects 

Для SQL Server

SELECT TOP 1 NAME FROM sysobjects 
+0

DSN указывают на внешнюю базу данных SQL Server. Извините, должен был указать - я обновлю вопрос, чтобы его отразить. –

+0

Доступ не может использоваться ODBC для подключения к базе данных Jet, поэтому первая не будет использоваться в Access. –

5
 

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 
 

EDIT: DSN Формат может быть «DSN = MyDSN; UID = myuser; PWD = myPwd;»
Посмотрите this для соединения строк

+0

Это хороший подход, и я изначально принял его в качестве ответа. Тем не менее, он по-прежнему выдает ошибку, если «DSN HERE» является недопустимой строкой соединения. Methinks ADO нуждается в методе TryOpen! :) –

+0

DSN следует знать заранее. Что вы пытаетесь сделать? – shahkalpesh

2

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

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

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

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

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

Public Sub TestConnection() On Error GoTo ErrTest

Dim i As Integer

If m_objConnect Is Nothing Then

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

Else

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. Источник & ":" & Err.Description Resume Next

End Sub

Private Function ObjectStateString (ObjectState Как ADODB.ObjectStateEnum) As String

Select Case ObjectState Case ADODB.ObjectStateEnum.adStateClosed ObjectStateString = "Закрыто" Case ADODB.ObjectStateEnum .adStateConnecting ObjectStateString = "Подключение" Дело ADODB.ObjectStateEnum.adStateExecuting ObjectStateString = "Выполнение" Дело ADODB.ObjectStateEnum.adS tateFetching ObjectStateString = "Извлечение" Case ADODB.ObjectStateEnum.adStateOpen ObjectStateString = "Открыть" Case Else ObjectStateString = "Государство" & CLng (ObjectState) & ": неизвестное состояние номер" End Select

End Function

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

0

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

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

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

Смежные вопросы