OVH Cloud OVH Cloud

SVP Urgent ADO - Avis aux experts

1 réponse
Avatar
Daryl
Bonjour,


J'ai remarqué des pb de preformance dans mon application VB/ADO/SQL Server,
j'ai observé que cela provient de la déclaration des tables. En effet le cas
n°1 (voir code ci-dessous) est plus lent que le cas n°2 (voir code
ci-dessous) et du N°3 (voir code ci-dessous).

Pourquoi ? Y-a-t-il une différence entre le cas numéro 2 et numéro 3 ? Que
choisir ?.

Cas n°1 : Pas de fermeture de la table avec : set TABLE = nothing

Dim BASE As ADODB.Connection
Set BASE = New ADODB.Connection
Dim TABLE1 As New ADODB.Recordset
Set TABLE1 = New ADODB.Recordset
Dim TABLE2 As New ADODB.Recordset
Set TABLE2 = New ADODB.Recordset

[ Traitement avec un open recordset ]
TABLE1.close

[ Traitement avec un open recordset ]
TABLE2.close

BASE .close
Set BASE = nothing

Cas n°2 : Fermeture de la table avec : set TABLE = nothing

Dim BASE As ADODB.Connection
Set BASE = New ADODB.Connection
Dim TABLE1 As New ADODB.Recordset
Set TABLE1 = New ADODB.Recordset
Dim TABLE2 As New ADODB.Recordset
Set TABLE2 = New ADODB.Recordset

[ Traitement avec un open recordset ]
TABLE.close
Set TABLE1 = nothing

[ Traitement avec un open recordset ]
TABLE2.close
Set TABLE2 = nothing

BASE .close
Set BASE = nothing

Cas n°3 : Pas de déclaration avec : set TABLE =

Dim BASE As ADODB.Connection
Set BASE = New ADODB.Connection
Dim TABLE1 As New ADODB.Recordset
Dim TABLE2 As New ADODB.Recordset

[ Traitement avec un open recordset ]
TABLE.close

[ Traitement avec un open recordset ]
TABLE2.close

BASE .close
Set BASE = nothing

1 réponse

Avatar
Med Bouchenafa [MVP]
La syntaxe Dim NomVariable as New Object est à éviter autant que possible
Elle fait que NomVariable est instanciée à chaque fois que VB la rencontre dans le code
Cela peut conduire à des contractions logiques qui doivent être expliquées sur une des fiches de la
KB.
La plus célèbre de ces contradictions est fournie par l'exemple suivant

Dim X As New Objet
...
....traitement quelconque
....
Set X = Nothing
If X Is Nothing Then
MsgBox "Vrai"
Else
MsgBox "Faux"
End If

Si tu testes le code précédent, tu auras une petite surprise car X est instanciée à nouveau dans le
IF


Le mieux est de toujours séparer la déclaration des variables
Dim BASE As ADODB.Connection
Dim TABLE1 As ADODB.Recordset
Dim TABLE2 As ADODB.Recordset

de leur instanciation
Set BASE = New ADODB.Connection
Set TABLE1 = New ADODB.Recordset
Set TABLE2 = New ADODB.Recordset
...
....
Les traitement se font ici
...
....
et pour sortir fermer proprement
TABLE1.close
TABLE2.close
BASE .close
e désallouer proprement l'espace
Set TABLE1 = nothing
Set TABLE2 = nothing
Set BASE = nothing


--
Salutations
Med Bouchenafa
TETRASET
75015 Paris

"Daryl" a écrit dans le message de news:
#e$
Bonjour,


J'ai remarqué des pb de preformance dans mon application VB/ADO/SQL Server,
j'ai observé que cela provient de la déclaration des tables. En effet le cas
n°1 (voir code ci-dessous) est plus lent que le cas n°2 (voir code
ci-dessous) et du N°3 (voir code ci-dessous).

Pourquoi ? Y-a-t-il une différence entre le cas numéro 2 et numéro 3 ? Que
choisir ?.

Cas n°1 : Pas de fermeture de la table avec : set TABLE = nothing

Dim BASE As ADODB.Connection
Set BASE = New ADODB.Connection
Dim TABLE1 As New ADODB.Recordset
Set TABLE1 = New ADODB.Recordset
Dim TABLE2 As New ADODB.Recordset
Set TABLE2 = New ADODB.Recordset

[ Traitement avec un open recordset ]
TABLE1.close

[ Traitement avec un open recordset ]
TABLE2.close

BASE .close
Set BASE = nothing

Cas n°2 : Fermeture de la table avec : set TABLE = nothing

Dim BASE As ADODB.Connection
Set BASE = New ADODB.Connection
Dim TABLE1 As New ADODB.Recordset
Set TABLE1 = New ADODB.Recordset
Dim TABLE2 As New ADODB.Recordset
Set TABLE2 = New ADODB.Recordset

[ Traitement avec un open recordset ]
TABLE.close
Set TABLE1 = nothing

[ Traitement avec un open recordset ]
TABLE2.close
Set TABLE2 = nothing

BASE .close
Set BASE = nothing

Cas n°3 : Pas de déclaration avec : set TABLE >
Dim BASE As ADODB.Connection
Set BASE = New ADODB.Connection
Dim TABLE1 As New ADODB.Recordset
Dim TABLE2 As New ADODB.Recordset

[ Traitement avec un open recordset ]
TABLE.close

[ Traitement avec un open recordset ]
TABLE2.close

BASE .close
Set BASE = nothing