如果服务器不存在,我如何使ADO连接超时更快



我的任务是支持旧的VB6应用程序。(耶我)我有ADO连接超时属性的麻烦。如果服务器存在,下面的方法可以正常工作,但是如果服务器不存在或者机器的网络连接还没有启动,即使将intTimeout设置为1,它也需要整整30秒的时间来超时。

是否有一种方法可以让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

ConnectionTimeout在TCP连接建立后生效。如果找不到服务器,这个值由Windows TCP子系统控制。

如果这对你来说真的是个问题,我会试着先ping一下这个盒子(网上有很多通过VB6 ping的例子)。

我也击中了这个。设置ConnectionTimeout的另一种方法是使Open调用异步,然后在自己的代码中处理超时。下面是一个简单的例子(注意:这是在VBA中,但应该很容易移植到VB6):

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

为了"正确地"做这件事,你可以处理一个ConnectionComplete事件。

最新更新