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 :

Utilisation de using et fermeture de connexion


Sujet :

ADO.NET

  1. #1
    Modérateur
    Avatar de Flaburgan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 229
    Points : 3 579
    Points
    3 579
    Par défaut Utilisation de using et fermeture de connexion
    Bonjour,

    C'est une question de syntaxe, j'aurais aimé comprendre l'utilisation de using.

    Imaginons un cas classique :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SQLiteConnection connection = new SQLiteConnection(connectionString);
    connection.Open();
    SQLiteCommand commande = connection.CreateCommand();
    commande.CommandText = @"SELECT * FROM Data;";
    SQLiteDataReader reader = commande.ExecuteReader();
    while (reader.Read()) {
         //traitement
    }
    reader.Close();
    connection.Close();

    Maintenant, j'ai aussi vu qu'on pouvait déclarer SQLiteConnection, Command et Reader dans des using() (je suis tombé sur des exemples). Cependant, les gens fermaient quand même la connexion juste avant de fermer le using. Ils ne le faisaient pas pour le reader par contre.

    Donc ma question, à quoi sert le using si on est obligé de faire Close() avant de le fermer quand même ? ça sert à quelque chose de fermer le reader si on l'a ouvert avec un using ? et tant qu'on y est, l'@ avant la commande SQL, ça sert à quoi ?

    Voilà, spam de questions :p
    "Historiquement, techniquement, économiquement et moralement, Internet ne peut pas être contrôlé. Autant s’y faire." Laurent Chemla

    Je soutiens Diaspora*, le réseau social libre.

    Veillez à porter une attention toute particulière à l'orthographe...

    Blog collaboratif avec des amis : http://geexxx.fr

    Mon avatar a été fait par chiqitos, merci à lui !

  2. #2
    Invité
    Invité(e)
    Par défaut
    Le using te permet de libérer les ressources utilisé

  3. #3
    Modérateur
    Avatar de Flaburgan
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2010
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 229
    Points : 3 579
    Points
    3 579
    Par défaut
    Donc si ma méthode se termine la ligne en dessous de "connexion.close", il n'apportera rien ?
    "Historiquement, techniquement, économiquement et moralement, Internet ne peut pas être contrôlé. Autant s’y faire." Laurent Chemla

    Je soutiens Diaspora*, le réseau social libre.

    Veillez à porter une attention toute particulière à l'orthographe...

    Blog collaboratif avec des amis : http://geexxx.fr

    Mon avatar a été fait par chiqitos, merci à lui !

  4. #4
    Invité
    Invité(e)
    Par défaut
    L’instruction using te permet de libérer les ressources utilisées par l'objet sur lequel on l'applique en appelant implicitement la méthode Dispose de cet objet.

    La méthode Dispose() appelle aussi implicitement la méthode Close de ta connexion donc ta dernière instruction connexion.close() ne sert à rien mais apporte plus de lisibilité.

  5. #5
    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
    pour compléter un peu
    les 3/4 des classes du framework sont géré par .net au niveau de la mémoire (vidage quand plus utilisé)
    certaines classes utilisent des objets de windows via des appels d'api par exemple, ou des objets qui ne sont pas codés en .net
    c'est le cas par exemple des images de System.Drawing, c'est windows qui les gèrent (gdi+ en fait), et aussi des connexions sql, des controles et forms etc...
    ces classent ont une méthode Dispose qui averti le truc externe qu'il faut vider la mémoire (car c'est hors de .net)

    using / end using ne peut etre utilisé qu'avec des variables de types IDisposable, ca permet d'être sûr que Dispose va être appelé en sortie de bloc using
    car si tu déclare ta connexion, que tu l'ouvres, que tu fais une requete qui plante, la suite du code n'est pas exécutée, soit ca va dans le catch si tu as un try catch, soit ca remonte à l'appelant
    dans ce cas ca ne passe pas sur connexion.close donc ta connexion ne sera pas fermée, et la mémoire par libérée rapidement
    using équivaut en celà à un try/finally, car même en cas d'erreur, le .dispose sera appelé sur la variable en sortie de bloc

    je confirme que .dispose sur une connexion appelle .close au passage (donc ferme la connexion)


    fermer un reader n'est pas utile si on ferme la connexion, car il sera fermé au passage

    Nb : si on oublie d'appeler Dispose sur un objet l'ayant, ce n'est pas forcément grave, .net à un mécanisme de destruction tardive quand même (voir GC et finalize pour plus d'infos) qui fait que Dispose sera appelé quand même
    néanmoins dans une boucle qui instancie un grand system.drawing.bitmap par exemple, ne pas faire le dispose fait que l'appli va crasher avec OutOfMemory
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/08/2008, 16h45
  2. Utilisation de use strict et use warnings
    Par jmricatt dans le forum Langage
    Réponses: 1
    Dernier message: 16/06/2006, 14h40
  3. Fermeture de connexion en cas d'arrêt brutal
    Par Bartuk dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 30/05/2006, 17h12
  4. Réponses: 6
    Dernier message: 04/05/2006, 12h44
  5. [C#] La bonne utilisation des WinForms (ouverture-Fermeture)
    Par Harry dans le forum Windows Forms
    Réponses: 28
    Dernier message: 03/08/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