Bonjour,
Jusqu'à présent, je développais une appli VBA sans me casser pas trop la tête sur la gestion des erreurs ADODB, ce qui est une grave erreur ...
Je suis donc en train de retravailler mes modules pour en tenir compte désormais.
Première question : jusqu'à présent, hormis un ou deux formules qui utilise un recordset au niveau formulaire, une connexion ADODB était créée à chaque requête SQL. A priori ce serait la bonne approche (Comprendre les recordsets ADO)
Intuitivement, j'aurais pensé le contraire, que le fait de maintenir une connexion était moins coûteux que d'en créer une à chaque fois.
Quel est votre avis sur le sujet ?
Ensuite mon appli sera utilisée en client serveur séparé, donc avec communication réseau ... qui pourra notamment se faire en wifi. Donc il n'est pas déconnant de prévoir une communication de mauvaise qualité.
Je me propose donc de gérer d'éventuelle erreur de connexion à chaque fois que j'en ouvre une, avec une gestion dans ce goût là :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 On Local Error Resume Next Cn1.Open FN_CHAINESQL() If Cn1.State <> 1 Then On Error GoTo 0 v_tmp1 = "La base de données n'est pas joignable : ce formulaire ne peut fonctionner qu'en mode connecté !" MsgBox v_tmp1, vbCritical c_msg = "Base de données injoignable" c_msg.ForeColor = 255 Set Cn1 = Nothing Exit Sub End If On Error GoTo 0
Ensuite je ne suis pas à l'abri qu'une requête SQL ne plante pas. Donc je verrai bien également ce type de gestion pour les recordsets :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 On Local Error Resume Next Rq1.Open ChSQL, Cn1, adOpenStatic, adLockOptimistic If Rq1.State = 0 Then On Error GoTo 0 v_tmp1 = "Erreur de communication avec le serveur ou avec la requête SQL : Veuillez vérifier votre connexion réseau et réouvrir le formulaire, ou contacter l'administrateur si le problème persiste !" MsgBox v_tmp1, vbCritical c_msg = "Erreur avec le serveur et la requête SQL !!!!" c_msg.ForeColor = 255 DoCmd.Hourglass False Set Rq1 = Empty Set Cn1 = Empty Exit Sub End If On Error GoTo 0
Il faudrait également que je traite les cas où j'utilise un recordset de type adOpenForwardOnly, utilisé pour traiter des boucles qui peuvent être longues. Or il n'est pas dit qu'une erreur ne se produise pas au milieu de la boucle. Pour ce cas de figure, je pense qu'un classique On Error GOTO .... suffirait.
Encore qu'il serait bien de déterminer si le pb vient de la connexion ou de la requête.
Et bien sûr bien fermer et libérer les connexions et recordsets après usage.
Voilà pour les quelques idées que j'avais en-tête.
Merci d'avance pour vos critiques, vos retours d'expérience et vos préconisations.
Partager