Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5
  1. #1
    Modérateur
    Avatar de Flaburgan
    Homme Profil pro
    Développeur informatique
    Inscrit en
    avril 2010
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : avril 2010
    Messages : 1 215
    Points : 3 616
    Points
    3 616

    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# :
    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
    Membre Expert
    Homme Profil pro Guillaume
    Développeur .NET
    Inscrit en
    juillet 2006
    Messages
    863
    Détails du profil
    Informations personnelles :
    Nom : Homme Guillaume
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : juillet 2006
    Messages : 863
    Points : 1 361
    Points
    1 361

    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 informatique
    Inscrit en
    avril 2010
    Messages
    1 215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : avril 2010
    Messages : 1 215
    Points : 3 616
    Points
    3 616

    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 Confirmé Sénior Avatar de Pol63
    Homme Profil pro Sébastien
    Développeur .NET / DBA SQL SERVER
    Inscrit en
    avril 2007
    Messages
    11 200
    Détails du profil
    Informations personnelles :
    Nom : Homme Sébastien
    Âge : 32
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur .NET / DBA SQL SERVER
    Secteur : Industrie

    Informations forums :
    Inscription : avril 2007
    Messages : 11 200
    Points : 18 488
    Points
    18 488

    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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •