Как сделать тайм-аут соединения ADO раньше, если сервер не существует? - PullRequest
1 голос
/ 05 августа 2011

Мне поручено поддерживать старое приложение VB6. (yay me) У меня проблемы со свойством тайм-аута соединения ADO. Приведенный ниже метод работает нормально, если сервер существует, но если сервер не существует или сетевые подключения не запущены для компьютера, то потребуется тайм-аут в течение полных 30 секунд, даже если для intTimeout установлено значение 1.

Есть ли способ, чтобы ADO не смог подключиться раньше? Это вообще возможно? Спасибо!

Public Sub GetConnectionObject(ByRef oCn As ADODB.Connection, strServer As String,     strInitialCatalog As String, Optional intTimeout = 10)

    Dim strConnectionString As String
    strConnectionString = "Data Source=[SERVER];Provider=SQLOLEDB.1;User ID=ScanReq1;Password=ScanR3Q;Initial Catalog=[INITIALCATALOG];ConnectionTimeout=" & intTimeout & ";"
    strConnectionString = Replace(strConnectionString, "[SERVER]", strServer)
    strConnectionString = Replace(strConnectionString, "[INITIALCATALOG]", strInitialCatalog)

    Set oCn = New ADODB.Connection
    oCn.CursorLocation = adUseClient
    oCn.ConnectionString = strConnectionString
    oCn.CommandTimeout = intTimeout
    oCn.ConnectionTimeout = intTimeout

    oCn.Open

End Sub

Ответы [ 2 ]

5 голосов
/ 07 августа 2011

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

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

0 голосов
/ 19 августа 2016

Я также ударил этот.Альтернативой настройке ConnectionTimeout может быть сделать асинхронный вызов Open, а затем обработать таймаут в вашем собственном коде.Быстрый и грязный пример ниже ( примечание: это в VBA, но должно быть легко перенесено на VB6 ):

Dim conn As New ADODB.Connection
Dim time As Single, timeOut As Single
conn.ConnectionString = "your connection string here"
conn2.Open Options:=adAsyncConnect                    ' value is 16
timeOut = 5
time = Timer()
Do Until Timer() - time > timeOut Or conn2.State = adStateOpen
    DoEvents
Loop
If conn2.State <> adStateOpen Then              'value is 1
    'timed out
Else
    'successful
End If

Чтобы сделать это "правильно", есть ConnectionCompleteсобытие, которое вы могли бы обработать.

...