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 :

Ouverture et fermeture connexion SQL.


Sujet :

VB.NET

  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Développement
    Inscrit en
    Février 2016
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développement
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2016
    Messages : 55
    Points : 38
    Points
    38
    Par défaut Ouverture et fermeture connexion SQL.
    Bonjour,
    Je développe une application en VB.net. J'ai une classe dans laquelle se trouve plusieurs fonctions qui permettent d'exécuter des requêtes SQL. Chaque fois qu'une fonction de cette classe est appelé, j'ouvre la connexion et je ferme celle-ci. Est-il correct de procéder ainsi? Sinon, comment fait-on pour bien gérer une connexion SQL? Parfois, j'obtiens le message d'erreur "current state is open" et pourtant ma connexion est selon moi fermé, d'après ce que je vois dans mon code.

    Merci de me répondre, votre aide serait apprécié.

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Le regroupement de connexions (connection pooling) à la base de données est automatiquement opéré par le pilote que l'on utilise pour y accéder (ADO.NET, ODBC, OLEDB, ...).
    Un pool est utilisé pour toutes les connexions utilisant précisément la même chaîne de connexion.
    Les paramètres de la session sont réinitialisés automatiquement, toujours par le pilote, qui fait un appel à sp_reset_connection (sauf exception, comme le niveau d'isolation des transactions).

    Donc le problème vient du code, et là je ne peux pas trop vous aider ...

    @++

  3. #3
    Nouveau membre du Club
    Femme Profil pro
    Développement
    Inscrit en
    Février 2016
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développement
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2016
    Messages : 55
    Points : 38
    Points
    38
    Par défaut
    Bonjour,

    En fait, est- il correct que dans chaque fonction ou j'exécute une requête j'ouvre et je ferme la connexion? Je comprends mal comment gérer plusieurs connexions. J'ai ma fonction et par exemple je fais connectionSql.open, j'exécute la requête et ensuite je fais connectionSql.close, et ce, pour chaque fonction qui sont appelées. Est-il correct de procéder ainsi?

    Merci pour votre aide!

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 150
    Points : 25 066
    Points
    25 066
    Par défaut
    oui, c'est ce qui est recommandé par la plupart des bases de données, ouverture puis fermeture dès qu'on a fini d'utiliser la liaison
    en multithreading il peut donc y avoir plusieurs connexions ouvertes en même temps, ca ne pose pas de soucis sur les vraies bases de données

    par contre il faut bien des objets connexions uniques pour chaque fonction
    si tu as une variable as sqlconnection pour toute la classe c'est moins top (enfin sauf si tu n'utilises que le thread principal)
    c'est d'ailleurs pour ca qu'on encapsule en général l'accès aux données dans une classe qui s'occupe de la connexion, de l'exécution de la requête et du retour de données

    au passage on utilise en général un using/end using
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Using con as new sqlconnection
      ' code
    end using
    le using permet d'être sûr que la méthode Dispose est appelée en sortie de bloc (même sur une exception)

    Dispose permet de libérer la mémoire non managée utilisée, pour les connexions sql dispose appelle aussi close
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Bonjour à tous, je rebondis un peu sur ce sujet concernant le Using - End using ...

    Lorsque j'insère une nouvelle ligne je le fais ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Form1.Table1bindingSource.DataSource.Rows.Add(New Object() {............})
    Pour modifier, je mets à jour le Table1datoagridview puis termine ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Me.Validate()
                        Form1.Table1bindingSource.EndEdit()
                        Form1.Table1dataAdapter.Update(CType(Form1.Table1bindingSource.DataSource, DataTable))
                        Form1.Table1.AcceptChanges()
    Actuellement, je me sers du Try / Catch / End try.... Si je comprends bien dans le cas d'une exception, on passe directement au Catch puis je suppose que le programme continue directement après le End Try ?
    Je n'arrive pas dans mon cas à savoir comment utiliser le Using .... End Using dans mon cas ....
    Si je fais un Me.dispose() après mon End Try, ais-je toutes les chances que ma connexion est fermée quoi qui se passe ?

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 150
    Points : 25 066
    Points
    25 066
    Par défaut
    je ne suis pas spécialiste du dataadapter, mais ici tu ne gères pas directement la connexion donc tu n'as pas de question spécial à te poser là dessus je pense

    après dans le principe du try catch, en cas d'erreur, ca passe au catch puis au end try et ca continue
    il existe aussi finally, on peut faire soit un try/finally, soit un try/catch soit un try/catch/finally
    le code qui est mis entre finally et end try est exécuté dans tous les cas, qu'on sorte normalement du try ou qu'on y sorte par le catch

    donc dans les faits dans que ca soit avec un catch et/ou un finally on se demande comment rester dans un état propre (sans truc à moitié fait ou à moitié ouvert)
    beaucoup de choses peuvent générer une exception, pour les méthodes du framework, il y a dans l'aide la liste des exceptions qu'un membre peut lever et la cause
    et après il y a les choses du langages, comme un dépassement de capacité, appeler un membre sur une variable qui vaut nothing etc...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Salut Pol63,

    Merci pour ces précisions. Le Me.dispose() libère pas mal de choses, ferme-t-il aussi une connexion qui aurait pu être ouverte et pas refermée ?

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 150
    Points : 25 066
    Points
    25 066
    Par défaut
    me.dispose libère la mémoire non managée de l'instance en cours
    sur une fenetre ca la ferme, puis ca libère les ressources

    après sur le reste c'est le GC qui agit, quand l'instance sera collectée toutes ses variables seront mises à nothing
    et dans les variables en questions, quand elles ne seront plus pointées par rien elles seront à leur tour collectées
    et le finaliseur d'une connexion doit la fermer ...

    en bref il vaut mieux faire tout ce qu'on peut soit même ^^
    et au passage comprendre ce qu'est la mémoire non managée, la méthode finalize, le fonctionnement du GC etc...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 261
    Points : 98
    Points
    98
    Par défaut
    Re,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    en bref il vaut mieux faire tout ce qu'on peut soit même
    Oui tout à fait d'accord avec toi. Quand tout va bien, pas de soucis. C'est quand une exception est levée que çà peut un peu semer la zizanie ....

Discussions similaires

  1. Ouverture propre d'une connexion SQL
    Par Anduriel dans le forum VB.NET
    Réponses: 2
    Dernier message: 25/10/2010, 01h28
  2. Fermeture connexion base SQL Server
    Par peaceandloveman01 dans le forum ASP.NET
    Réponses: 6
    Dernier message: 04/11/2009, 17h14
  3. Connexion SQL Server
    Par Bart51 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 06/05/2004, 11h49
  4. connexion sql serveur
    Par DiJiRiDouS dans le forum ASP
    Réponses: 10
    Dernier message: 16/09/2003, 17h14
  5. Resau local => ouverture et fermeture
    Par Nutcase dans le forum Développement
    Réponses: 8
    Dernier message: 17/11/2002, 16h16

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