我的任务是支持旧的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
事件。