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

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 43
    Points : 22
    Points
    22
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    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 à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 43
    Points : 22
    Points
    22
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    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 à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 43
    Points : 22
    Points
    22
    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 : 42
    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
    Points : 3 173
    Points
    3 173
    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...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  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 : 42
    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
    Points : 39 749
    Points
    39 749
    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

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 43
    Points : 22
    Points
    22
    Par défaut
    il y a 95% de chance de pouvoir faire votre traitement sans boucle...
    En l'occurence si je suis obligé de boucler ici, c'est que j'ai plusieurs update à faire dans des tables différentes. Je ne vois pas comment je peux faire pour mettre à jour plusieurs table en une seule requete

  9. #9
    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 : 42
    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
    Points : 3 173
    Points
    3 173
    Par défaut
    Je refais actuellement tous les 'batchs' d'un site d'ebusiness qui on été codés en C# avec la même technique...

    Ce n'est pas une attaque, peut être ne pouvez vous pas faire qu'une seule requète mais je suppose que vos update répondent à une certaines logiques... vous devriez pouvoir arriver à un nombre de requete égal au nombre de tables différents concernées?
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  10. #10
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    Citation Envoyé par huggy49 Voir le message
    En l'occurence si je suis obligé de boucler ici, c'est que j'ai plusieurs update à faire dans des tables différentes. Je ne vois pas comment je peux faire pour mettre à jour plusieurs table en une seule requete
    Je suis d'accord avec vous, il faut que nous puissions voir ton code, essaie de poster un psodo-code car c'est ce genre de code qui dégrade la réputation des languages et des SGBDR !

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  11. #11
    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 : 42
    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
    Points : 3 173
    Points
    3 173
    Par défaut
    WOLO: Merci à toi.
    Je suis du côté SGBDR de la force mais je travaille en etroite collaboration avec les équipes de développement .NET, venant moi-même du développement .NET...

    Dernièrement j'ai repris un batch d'import fais avec... LINQ TO SQL...
    Le batchs avec de judicieuses boucles imbriquées générait 45 millions de requètes...
    On ne l'a jamais vu tourner jusqu'au bout...
    Il dure désormais 18 secondes avec 3 requètes...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

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