IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

ADO.NET Discussion :

Problème sur OleDbCommand


Sujet :

ADO.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 43
    Par défaut Problème sur OleDbCommand
    Bonjour,

    j'ai un problème avec le composant OleDbCommand.

    Voici le code principal :

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

    ExecuteReader nécessite une connexion ouverte et disponible, la connexion est actuellement fermée.
    J'ai modifier le code en déplaçant le close du d2 en dehors de la boucle while :

    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
    Maintenant j'ai le message suivant :

    la commande n'était pas préparée, impossible d'allouer de la mémoire
    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).

    Ma question est la suivante, de quelle façon doit-on procéder pour libérer correctement cette mémoire.

    Merci d'avance

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    C'est assez logique que la connexion soit fermée, puisque tu as mis CommandBehavior.CloseConnection en paramètre de ExecuteReader...


    Sinon, connais-tu l'instruction Using ? C'est le meilleur moyen de fermer proprement les ressources comme les connexions, datareader, etc, même si une exception se produit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                     Using d2 As IDbDataReader = req2.GetValeursAsReader("select ...")
     
                        If (d2.HasRows = False) Then
                            ...
                        End If
                     End Using
    A la fin du bloc Using, ça appelle automatiquement la méthode Dispose, qui elle-même appelle Close

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 43
    Par défaut
    Merci,

    non je ne connaissais pas. Dans ce cas je n'ai plus besoin de me soucier à faire des .close() ?

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par huggy49 Voir le message
    Dans ce cas je n'ai plus besoin de me soucier à faire des .close() ?
    Non, enfin pas pour les objets déclarés avec Using

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 43
    Par défaut
    En fait dans mon code je n'ai pas besoin de faire des .close(). Il me suffit de faire des .fermer() sur les objets req.

    Avec :

    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 Sub Fermer()
                Try
                    Me.Conn.fermer()
                Catch ex As Exception
     
                End Try
     
                Try
                    Me._ConnC.Close()
                Catch ex As Exception
     
                End Try
     
            End Sub
    Sauf que ça ne va pas régler mon problème de mémoire...

  6. #6
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    on boucle plus de 64000 fois
    Çà ne vous interpelle pas? Peut on voir votre requête exécutée 64000 fois?
    Votre SGBD doit être ravi :-)

    Je rappel que SQL est un langage ensembliste, en opposition avec le les langages client itératif comme C#.

    il y a 95% de chance de pouvoir faire votre traitement sans boucle...


    Postez votre requête si vous le voulez...

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par huggy49 Voir le message
    En fait dans mon code je n'ai pas besoin de faire des .close(). Il me suffit de faire des .fermer() sur les objets req.
    Implémente IDisposable dans ton objet req, en appelant Fermer dans la méthode Dispose. Comme ça tu pourras aussi l'utiliser dans un bloc Using

Discussions similaires

  1. Problème sur la recherche fulltext en v4 !
    Par poppa dans le forum Requêtes
    Réponses: 3
    Dernier message: 13/05/2004, 23h06
  2. Problème sur fiche MDIchild
    Par nivet dans le forum Composants VCL
    Réponses: 6
    Dernier message: 23/01/2004, 08h07
  3. Problème sur GetPrivateProfileString ???
    Par Bordelique dans le forum Langage
    Réponses: 7
    Dernier message: 25/06/2003, 22h15
  4. Problème sur une requête INSERT
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/06/2003, 08h45
  5. problème sur une requête!!!!!
    Par Mcgrady_01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/06/2003, 01h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo