Vérifier si la connexion ADODB est ouverte

j'utilise ce qui suit dans certaines procédures excel pour établir une connexion à notre base de données.

Private Const strConn As String = _
    "PROVIDER=SQLOLEDB.1 ..."     

Sub OpenConnection()

Set cn = CreateObject("ADODB.Connection")
cn.Open strConn
cn.CommandTimeout = 0
Set rs = CreateObject("ADODB.Recordset")
Set rs.ActiveConnection = cn

End Sub 

dans le code suivant j'ouvre la connexion en utilisant diverses chaînes SQL.

Je voudrais tester si rs est ouvert donc je sais qu'il doit être fermé, mais les suivants ne fonctionne pas. Comment puis-je changer la condition ci-dessous pour travailler?

If (rs.Open = True) Then
    rs.Close
End If

Les ouvrages suivants, mais je préfère ne pas utiliser la récupération d'erreur de cette façon:

On Error Resume Next
    rs.Close
14
demandé sur whytheq 2013-07-12 13:20:11

2 réponses

jeu d'enregistrements ADO a .State propriété, vous pouvez vérifier si la valeur est adStateClosed ou adStateOpen

If Not (rs Is Nothing) Then
  If (rs.State And adStateOpen) = adStateOpen Then rs.Close
  Set rs = Nothing
End If

MSDN sur l'État de la propriété

Modifier; La raison de ne pas vérifier .State contre 1 ou 0 est parce que même si cela fonctionne 99,99% du temps, il est toujours possible d'avoir autres drapeaux ce qui causera l'échec de la déclaration adStateOpen vérifier.

Edit2:

pour reliure tardive sans les données ActiveX Objets référencés, vous avez peu d'options. Utilisez la valeur de la constante d'adStateOpen de ObjectStateEnum

If Not (rs Is Nothing) Then
  If (rs.State And 1) = 1 Then rs.Close
  Set rs = Nothing
End If

ou vous pouvez définir la constante vous-même pour rendre votre code plus lisible (les définir tous pour un bon exemple.)

Const adStateClosed As Long = 0 'Indicates that the object is closed.
Const adStateOpen As Long = 1 'Indicates that the object is open.
Const adStateConnecting As Long = 2 'Indicates that the object is connecting.
Const adStateExecuting As Long = 4 'Indicates that the object is executing a command.
Const adStateFetching As Long = 8 'Indicates that the rows of the object are being retrieved.    

[...]

If Not (rs Is Nothing) Then

    ' ex. If (0001 And 0001) = 0001 (only open flag) -> true
    ' ex. If (1001 And 0001) = 0001 (open and retrieve) -> true
    '    This second example means it is open, but its value is not 1
    '    and If rs.State = 1 -> false, even though it is open
    If (rs.State And adStateOpen) = adStateOpen Then 
        rs.Close
    End If

    Set rs = Nothing
End If
25
répondu Raybarg 2013-07-17 05:44:28

ce sujet est ancien mais si d'autres personnes comme moi cherchent une solution, c'est une solution que j'ai trouvé:

Public Function DBStats() As Boolean
    On Error GoTo errorHandler
        If Not IsNull(myBase.Version) Then 
            DBStats = True
        End If
        Exit Function
    errorHandler:
        DBStats = False  
End Function

donc "myBase" est un objet de base de données, j'ai créé une classe pour accéder à la base de données (class with insert, update etc...) et sur le module la classe est utilisation declare dans un objet (évidemment) et je peux tester la connexion avec "[L'objet].DBStats":

Dim BaseAccess As New myClass
BaseAccess.DBOpen 'I open connection
Debug.Print BaseAccess.DBStats ' I test and that tell me true
BaseAccess.DBClose ' I close the connection
Debug.Print BaseAccess.DBStats ' I test and tell me false

Edit : Dans DBOpen-je utiliser "OpenDatabase" et dans DBClose-je utiliser ".Fermer " et " mettre myBase = rien" Edit 2: Dans la fonction, si vous n'êtes pas connecter, .la version vous donne une erreur donc si vous n'êtes pas connectés, le errorHandler vous donne false

0
répondu JustGuest 2016-01-12 18:22:10