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

VB.NET Discussion :

Conseil connexion a une base access [Débutant]


Sujet :

VB.NET

  1. #1
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2010
    Messages : 277
    Par défaut Conseil connexion a une base access
    Bonjour

    Voici mon cas:

    J'ai une boucle qui contient des procédures.
    La boucle peut faire de 30 a 100 tours.
    Je suis obligé d'ouvrir une connexion a une base access et de la fermer dans la boucle.

    Il me faut une autre connexion a une autre base access et pour celle la je me pose la question:
    Que vaut il mieux faire?

    Ouvrir et fermer dans la boucle, soit entre 50 et 100 ouverture/fermeture?
    ou
    Ouvrir et fermer une seule fois a l'extérieur de la boucle?

    Sachant que la boucle met un peu de temps a s’exécuter (environ 6 a 8 secondes), donc dans le cas d'une seule ouverture la fermeture va se faire plusieurs minute après.

    Si je pose cette question, c'est que j'ai un soucis de connexion qui reste ouverte si je passe 10 fois dans la boucle. Elle se ferme normalement si je ne passe que 9 fois.
    Ensuite cela me laisse un fichier MaBase.ldb ouvert a coté de ma base, que je n'arrive plus du tout a fermer.

    J’espère avoir été clair.
    Merci d'avance

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    niveau performances il vaut mieux ne pas ouvrir 20x la connexion en une seconde, mais la garder pour la boucle

    ca ne pose pas de problème de garder une connexion ouverte longtemps, certains ouvrent une connexion au démarrage de l'appli et la ferme à la fermeture de l'appli, en utilisant toujours la même donc
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2010
    Messages : 277
    Par défaut
    merci de ta réponse Pol63

    Mais cela ne pose t 'il pas de problème si j’exécute plusieurs requêtes différente a chaque tour?
    Et pourquoi la connexion ne veut plus se fermer au bout de 10 tours?

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    une fois la connexion ouverte tu peux exécuter autant de requêtes que tu veux, identiques ou différentes.

    la connexion ne veut plus se fermer
    c'est à dire ?
    connexion.close ou encore mieux connexion.dispose et elle se ferme ...
    un message d'erreur ? un bout de ton code ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2010
    Messages : 277
    Par défaut
    ben justement non, c'est la tout le probleme.

    Je suis même allé jusqu’à faire ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      While Not MyConnexionQuadra.State = ConnectionState.Closed
                    MyConnexionQuadra.Dispose()
                    MyConnexionQuadra.Close()
                End While
    je n'ai aucun message d'erreur juste la connexion qui reste ouverte.

    D’ailleurs si je réexecute la procédure cela fonctionne.
    Comme s'il restait un fantôme

  6. #6
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2010
    Messages : 277
    Par défaut
    Je viens de mettre la connexion dans la boucle, et bien ça marche maintenant.
    je n'ai plus de connexion ouverte a la fin.

    J'utilise access 2003, un soucis avec access peu être qui n'aimerai pas qu'on lui envoie trop de requetes sur la même connexion?

    Pour info,
    - parfois la connexion se fermait avec la fermeture du prog.
    - Parfois meme aprés la fermeture du prog pas moyen qu'elle se ferme si ce n'est avec click droit dessus et supprimer.
    -J'ai meme testé, un bouton avec comme action
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MyConnexionQuadra.Close()
    lorsque la connexion restait ouverte, le tout dans un try catch, cela ne génère pas d'erreur.

    D’où ma question ici, quelque chose a du m'échapper.

    EDIT: Maintenant c'est la deuxième connexion qui reste ouverte, alors que toute a l'heure elle se fermait

  7. #7
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    non , je le répète access n'est pas dérangé par le fait qu'on lui envoie plein de requetes

    le code conseillé c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    using myconnexion as new oledbconnection
      ' utilisation de la connexion
    end using
    le bloc using fait que la connexion est détruite en sortie de bloc même en cas d'erreur (appel à dispose qui ferme la connexion et vide la mémoire)

    la fermeture du programme entraine la fermeture de la connexion
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  8. #8
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2010
    Messages : 277
    Par défaut
    Bonjour
    je ne sais pas si cela va vraiment faire mon affaire le using.

    J'ai un bloc principale qui se sert d'une class contenant les requetes, c'est lui qui contient la boucle.
    Dans cette boucle j'ai l'ouverture d'une connexion a la bdd1 et fermeture a la fin.
    Dans la class, j'ouvre une connection a la bdd2, des fois je ferme a la sortie de la procedure, des fois je fais appel a d'autre procedure.


    Avec using ma connexion reste t 'elle ouverte lors de l'appel a une sous procedure?

  9. #9
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    entre using et end using la connexion existe, hors la variable n'est pas utilisable et vs ne reconnaitra pas la variable
    le using est fortement recommandé dans beaucoup de cas, il équivaut à un try finally du dispose

    enfin j'ai l'impression que ton code est étrangement structuré, ce qui laissera à penser que c'est un mauvais codage qui ferait que ta connexion reste ouverte, tu dois laisser une variable connexion sans référence ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2010
    Messages : 277
    Par défaut
    merci de ta réponse

    Qu'appelles tu une variable connexion sans référence?

    j'ai essayé le using mais hormis le fait que cela me fait plus de lignes a écrire (vu que je ne peux plus me servir de ma class).
    La connexion n'est pas ouverte dans une function lorsque je sors de la procedure pour appeller cette function (ok c'est ce que tu as dit )

    Donc si je comprends bien
    Using /end using fonctionne uniquement dans une procedure.
    Par contre plus de probleme de fermeture, si je les mets dans chaque fonction/procedure?

    Si c'est cela, je vais ouvrir/fermer la connexion environ 7 fois par tour de boucle.


    Mon code est a peu prés structuré comme cela (a la difference prés que les procedure1 etc sont dans une class:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    'Procedure principale
     
    Myconnexion.open
     
    for i=0 to 100
    appelProcedure1
    appelProcedure2
    ...
    appelProcedure5
    next
     
    myconnexion.close
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public sub Procedure1
    Myconnexion2.open
    Mon travail
     
    Myconnexion2.close

    dans la configuration du code que j'ai mis Myconnection reste ouverte a la fin.
    Si je mets MyConnexion dans la boucle, alors c'est Myconnexion2 qui reste ouverte.

    Je vais refaire mes connexion avec using, et je te tiens au courant.

  11. #11
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    using sert uniquement dans une procédure oui, si tu utilises ta connexion dans plusieurs sub et donc en variable de classe ca ne te servira pas
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2010
    Messages : 277
    Par défaut
    Je viens d'utiliser using sur la premiere Connexion, le probleme reste le meme.
    La connexion1 reste ouverte si elle est faite hors de la boucle.
    C'est la connexion2 qui reste ouverte si la connexion1 est dans la boucle.

    Tu me parlais de
    j'ai l'impression que ton code est étrangement structuré, ce qui laissera à penser que c'est un mauvais codage qui ferait que ta connexion reste ouverte
    Comment puis je faire, as ton avis pour résoudre ce problème?

  13. #13
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    je ne peux pas vraiment t'aider plus
    avec le code sous les yeux j'aurais surement des remarques mais là à part dire de bien disposer toutes les variables connexions créées je ne vois pas
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  14. #14
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2010
    Messages : 277
    Par défaut
    Bonsoir

    J'ai enfin trouvé

    Il fallait faire passer le Garbage Collector.
    Je pense que vu la vitesse, les connexions n'étant pas libéré assez vite une nouvelle s'ouvrait et l'ancienne (même si je l'avais fermé) restait en fantôme tant que le Garbage Collector n'était pas passé faire du ménage.

    En tout cas, merci Pol63 de m'avoir aidé.

  15. #15
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    le garbage collector ne détruit que ce qu'on a oublié de détruire soit même
    si le garbage collector ferme une connexion c'est que comme je le dis depuis le début tu as des connexions que tu ne fermes pas ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  16. #16
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Août 2010
    Messages : 277
    Par défaut
    Bonjour

    J'ai revu tout le code (je ne peux pas le mettre ici car il est trop long et fait appel a beaucoup de procédures), mais toutes les connexions ouvertes sont refermé.


    Comment expliques tu ceci:

    Si la connexion a la BDD1 est dans la boucle c'est la connexion a la BDD2 qui reste ouverte.
    Si la connexion a la BBD1 est avant la boucle c'est la connexion a la BDD1 qui reste ouverte.

    De plus

    En mode pas a pas, je mets un point d’arrêt juste avant la sortie de la procédure principale.
    Et j'ecris
    MyConnexionBDD1.close
    Une fois passé la ligne je remonte le curseur pour la faire passer une nouvelle fois.
    Je n'ai pas d'erreur, comme si la connexion était ouverte, je peux faire passer autant de fois que je veux cette ligne sans erreurs.

    Si maintenant j'écris MyConnexionBDD1.open => Idem, pas d'erreur et la connexion s'ouvre (1 fois après cela me met une erreur).

    Normalement, je ne devrais pas pouvoir ouvrir une connexion déjà ouverte, es tu d'accord?

    Je ne devrais pas pouvoir fermer une connexion qui est déjà fermé non plus.

    Qu'en penses tu?

    J'ai acces 2003, windows7 64bits et l'unnité centrale cible est x86.

  17. #17
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    déjà c'est .dispose pour éviter que le garbage collector ait du travail, .dispose appele .close puis libère la mémoire

    après je le répète, s'il reste des connexions ouvertes, c'est forcément que tu ne les a pas fermé, il n'y a pas à discuter la dessus
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. pb de connexion a une base ACCESS
    Par steave dans le forum JDBC
    Réponses: 5
    Dernier message: 20/09/2007, 18h04
  2. [VB6]Problème connexion avec une base ACCESS
    Par mcay dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 15/05/2006, 17h47
  3. Pb de connexion sur une base access
    Par xave dans le forum ASP
    Réponses: 9
    Dernier message: 17/01/2006, 17h26
  4. connexion a une base access ,confirmation ?
    Par Melvine dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 16/12/2005, 11h51
  5. Obligation de connexion a une base access
    Par grillpain dans le forum Access
    Réponses: 12
    Dernier message: 12/12/2005, 12h39

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