2011-08-05 1 views
1

J'ai été chargé de supporter une ancienne application VB6. (yay moi) J'ai des problèmes avec la propriété ADO connection timeout. La méthode ci-dessous fonctionne bien si le serveur existe, mais si le serveur n'existe pas ou si les connexions réseau n'ont pas démarré pour la machine, il faudra 30 secondes pour expirer même si intTimeout est défini sur 1.Comment faire un délai d'attente de connexion ADO plus tôt si le serveur n'existe pas?

Y at-il un moyen pour ADO de ne pas se connecter plus tôt? Est-ce encore possible? Merci!

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

Il doit s'agir d'un problème de résolution de nom. Vous pouvez l'accélérer sur TCP en utilisant uniquement DNS (pas de diffusion + timeout) et en utilisant directement l'adresse IP pour [SERVER]. A votre place, je ne m'embêterais pas trop avec ce problème de "performance". – wqw

Répondre

5

Le ConnectionTimeout intervient après la connexion TCP. Si le serveur est introuvable, cette valeur est contrôlée par le sous-système TCP Windows.

Si c'est vraiment un problème pour vous, je vais essayer de faire un ping sur la boîte d'abord (il y a beaucoup d'exemples de ping via VB6 sur le net).

0

J'ai aussi frappé celui-ci. Une alternative à la définition ConnectionTimeout pourrait être de rendre l'appel Open asynchrone, puis gérer le délai d'attente dans votre propre code. Exemple rapide et sale ci-dessous (Note: Ceci est en VBA, mais devrait être facilement porté à 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 

Pour le faire « correctement », il y a un événement ConnectionComplete que vous pouvez manipuler.

Questions connexes