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
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
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