我的任务是支持旧的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
答案 0 :(得分:5)
在建立TCP连接后,ConnectionTimeout启动。如果找不到服务器,则此值由Windows TCP子系统控制。
如果这对你来说真的是个问题,我会先尝试ping这个盒子(网上有很多通过VB6 ping的例子)。
答案 1 :(得分:0)
我也打过这个。设置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
为了做到这一点&#34;正确&#34;,您可以处理ConnectionComplete
事件。