Soutenez-nous
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 211
    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 211
    Points : 3 702
    Points
    3 702

    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
    862
    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 : 862
    Points : 1 262
    Points
    1 262

    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 211
    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 211
    Points : 3 702
    Points
    3 702

    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
    Modérateur
    Avatar de h2s84
    Homme Profil pro Holty Samba SOW
    Développeur .NET
    Inscrit en
    mars 2007
    Messages
    3 000
    Détails du profil
    Informations personnelles :
    Nom : Homme Holty Samba SOW
    Âge : 29
    Localisation : Sénégal

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

    Informations forums :
    Inscription : mars 2007
    Messages : 3 000
    Points : 5 901
    Points
    5 901

    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é.
    Consultant .Net chez SoftFluent
    Découvrir notre produit CodeFluent Entities

    Adhérer à l'association Fier d'être développeur
    Les FAQ sur les technologies .Net voir ici
    Les cours et tutos sur les technologies .Net voir ici
    Les critiques sur les livres parlant des technologies .Net voir ici
    Pensez à la balise [CODE]
    Pensez au tag si votre problème est résolu

  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 002
    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 002
    Points : 16 812
    Points
    16 812

    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
  •