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

C# Discussion :

SqlDataReader déjà ouvert


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 896
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 896
    Par défaut SqlDataReader déjà ouvert
    Bonjour tout le monde,

    J'attaque les webParts, alors j'écris un PersonalizationProvider (ah oui parce qu'il y en a un de fourni mais pour SQL Server 2005, et maintenant on doit utiliser SQL Server 2014).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    using (SqlConnection conn = new SqlConnection(ConnectionString))
    {
    	conn.Open();
    	if (userName != null)
    	{
    		using (SqlCommand cmd = new SqlCommand(strSqlUser, conn))
    		{
    			cmd.Parameters.AddWithValue("@username", userName);
    			cmd.Parameters.AddWithValue("path", path);
    			cmd.Parameters.AddWithValue("applicationname", ApplicationName);
    			SqlDataReader reader = cmd.ExecuteReader();
    			if (reader.HasRows)
    			{
    				reader.Read();
    				userBlobDataObject = reader.GetFieldValue<Object>(0);
    				if (userBlobDataObject != null) userDataBlob =
    						   ObjectToByteArray(userBlobDataObject);
    				reader.Close();
    			}
    			cmd.Dispose();
    		}
    	}
    	conn.Close();    // Tiens donc pour quoi faire ?
    	conn.Open();
    	using (SqlCommand cmd = new SqlCommand(strSqlShared, conn))
    	{
    		cmd.Parameters.AddWithValue("path", path);
    		cmd.Parameters.AddWithValue("applicationname", ApplicationName);
    		SqlDataReader reader = cmd.ExecuteReader();
    		if (reader.HasRows)
    		{
    			reader.Read();
    			sharedBlobDataObject = reader.GetFieldValue<Object>(0);
    			if (sharedBlobDataObject != null) sharedDataBlob =
    					   ObjectToByteArray(sharedBlobDataObject);
    			reader.Close();
    		}
    		cmd.Dispose();
    	}
    }
    Si j'ai posé au milieu la question "pour quoi faire ?", c'est que fermer la connexion pour la rouvrir juste après ne me paraît pas spécialement intuitif.

    Si je ne le fais pas, on me dit qu'un reader est déjà ouvert sur le DataCommand, et qu'il faut le fermer avant d'en ouvrir un autre. Un fil d'il y a six ans lu à l'instant m'a appris que c'est la connexion qui maintient ouvert le reader, et non la commande, bien qu'ExecuteReader soit bien une méthode du SqlDataCommand.

    Donc, apparemment, j'ai dû faire une erreur de syntaxe, oublier de fermer le reader. Il y a pourtant bien un reader.Close() après chaque utilisation ?

    Je pousse même le zèle jusqu'à taper cmd.Dispose(), ce que j'avoue ne parfois pas faire. Et je retrouve encore le reader dans mes pattes la fois d'après.

    Plus précisément, tant que l'utilisateur est anonyme ça se passe bien puisqu'on n'exécute pas la première partie.

    Si quelqu'un peut me dire ce qui cloche ?

  2. #2
    Membre émérite
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 896
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 896
    Par défaut
    Ah mais oui, j'ai trouvé : je ne ferme le reader que si il y a des données (if reader.HasRows).

    Comme il n'y en a pas, ça coince.
    Une fois le reader.Close() remis en dehors des accolades du if(reader.HasRows), tout baigne, je peux enlever les lignes du milieu, en commentaire, pour gérer la connexion.

  3. #3
    Membre chevronné
    Avatar de nouanda
    Homme Profil pro
    Hobbyist
    Inscrit en
    Mai 2002
    Messages
    246
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Australie

    Informations professionnelles :
    Activité : Hobbyist

    Informations forums :
    Inscription : Mai 2002
    Messages : 246
    Par défaut
    Citation Envoyé par Gluups Voir le message
    Je pousse même le zèle jusqu'à taper cmd.Dispose(), ce que j'avoue ne parfois pas faire.
    A juste titre, puisqu'il sera nettoye par le garbage collector grâce a la clause using.
    Et au passage, SQLDataReader implémente également IDisposable, donc utiliser using est hautement recommande.

  4. #4
    Membre émérite
    Profil pro
    Développeur Web
    Inscrit en
    Février 2008
    Messages
    2 896
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2008
    Messages : 2 896
    Par défaut
    J'aurais bien mis reader.Dispose(), mais l'intellisense ne le trouve pas.
    Il aurait dû ?

    Alors je me suis contenté de reader.Close().

  5. #5
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 972
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 972
    Par défaut
    Voici la bonne manière de faire :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        using (SqlCommand command = new SqlCommand())
        {
            command.Connection = connection;
            command.Parameters.Add("@MyParameter", SqlDbType.VarChar).Value = "value";
            command.CommandText = "SELECT MyField1, MyField2 FROM MyTable where OtherFied=@MyParameter";
     
            try
            {
                connection.Open();
                using (SqlDataReader reader = command.ExecuteReader())
                {
                    if (reader.Read())
                    {
                        var x = reader.GetString(0);
                        var y = reader.GetInt32(1)); 
                    }
                }
            }
            catch (InvalidOperationException ex) { Log.Exception("InvalidOperationException", ex); }
            catch (SqlException ex) { Log.Exception("SqlException", ex); }
        }   
    }

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

Discussions similaires

  1. SqlDataReader déjà ouvert sur mon SqlCommand : où ça ?
    Par StringBuilder dans le forum ADO.NET
    Réponses: 5
    Dernier message: 09/12/2013, 14h45
  2. Réponses: 11
    Dernier message: 28/02/2007, 12h18
  3. [VB6] Savoir depuis VB, si un document Excel est ouvert
    Par Argonz dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 12/11/2002, 08h16
  4. Accès à une application ouverte (OLE Automation ?)
    Par PascalB dans le forum C++Builder
    Réponses: 6
    Dernier message: 17/06/2002, 14h39
  5. Nombre de fichiers ouverts simultanément
    Par matrixfan dans le forum C++Builder
    Réponses: 3
    Dernier message: 27/05/2002, 17h47

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