Bonjour,
j'ai un problème avec le composant OleDbCommand.
Voici le code principal :
Avec la fonction appelée :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 Dim req As New Requete(ConnectionCible.Commun, "") Dim req2 As New Requete(ConnectionCible.Commun, "") Try requete = "select ..." d = req.GetValeursAsReader(requete) While d.Read() d2 = req2.GetValeursAsReader("select ...") If (d2.HasRows = False) Then ... End If d2.Close() End While Catch ex As Exception Finally d.Close() req.Fermer() req2.Fermer() End Try
Mon problème était le suivant lorsque je passe dans la boucle la première fois, je faisais un d2.close(), or quand je repasse une deuxième fois dans la boucle et bien la connexion se retrouve fermée ; j'avais le message suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 Public Function GetValeursAsReader(ByVal req As String) As OleDbDataReader Dim les_champs As OleDb.OleDbDataReader Dim cmd As OleDb.OleDbCommand cmd = New OleDb.OleDbCommand(req, Me._ConnC) try les_champs = cmd.ExecuteReader(CommandBehavior.CloseConnection) catch end try Return les_champs End Function
J'ai modifier le code en déplaçant le close du d2 en dehors de la boucle while :ExecuteReader nécessite une connexion ouverte et disponible, la connexion est actuellement fermée.
Maintenant j'ai le message suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 Dim req As New Requete(ConnectionCible.Commun, "") Dim req2 As New Requete(ConnectionCible.Commun, "") Try requete = "select ..." d = req.GetValeursAsReader(requete) While d.Read() d2 = req2.GetValeursAsReader("select ...") If (d2.HasRows = False) Then ... End If End While Catch ex As Exception Finally d.Close() If not IsNothing(d2) then d2.Close() End If req.Fermer() req2.Fermer() End Try
Et je soupconne le fait qu'il n'y a pas de libération de mémoire puisqu'on ne fait qu'une seule fois le close du d2. Or dans mon cas il y a un très long traitement (on boucle plus de 64000 fois, et j'ai constaté mon erreur au bout de 6400 bouclage).la commande n'était pas préparée, impossible d'allouer de la mémoire
Ma question est la suivante, de quelle façon doit-on procéder pour libérer correctement cette mémoire.
Merci d'avance
Partager