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 qui se vide automatiquement


Sujet :

C#

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 8
    Points : 7
    Points
    7
    Par défaut SqlDataReader qui se vide automatiquement
    Bonjour,

    Je rencontre un problème dans l'utilisation d'un reader, voici tout d'abord mon code:

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    public static ListeAction getConstatsByGamme(string gamme)
            {
                ListeAction actions = null;
                SqlDataReader reader = null;
     
                SqlConnection conn = Connexion.getConnexion();
                conn.Open();
     
                String requete = "SELECT REP_CODE, REP_LIBELLE FROM TYPE_ACTIONS WHERE GROUP_CODE = @gamme AND B_CONSTAT = 1 ORDER BY REP_LIBELLE;";
     
                SqlCommand command = conn.CreateCommand();//new SqlCommand(requete, conn);
                command.CommandText = requete;
     
                command.Parameters.Add(new SqlParameter("@gamme", SqlDbType.VarChar, 10));
                command.Parameters["@gamme"].Value = gamme;
     
                try
                {
     
                    using (reader = command.ExecuteReader())
                    {
                        lock (reader)
                        {
                            while (reader.Read())
                            {
                                // création de la liste
                                if (actions == null)
                                {
                                    actions = new ListeAction();
                                }
     
                                TypeAction action = new TypeAction();
     
                                //action.setLibelle(UtilitaireDB.GererNullString(reader, "REP_LIBELLE"));
                                action.setLibelle(reader["REP_LIBELLE"].ToString());
                                //action.setCodeTypeAction(UtilitaireDB.GererNullInt32(reader, "REP_CODE"));
                                action.setCodeTypeAction(Convert.ToInt32(reader["REP_CODE"].ToString()));
     
                                actions.Add(action);
                            }                       
                        }
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e.Message);
                    throw;
                }
                finally
                {
                    conn.Close();
                    reader.Close();
                }
     
                return actions;
            }
    Premièrement, la requête fonctionne bien, elle me renvoie 3 lignes au total. (Dans SQL Server Management)

    Le reader.ExecuteReader() me renvoie aussi les 3 lignes (Vérifié à l'aide du pas à pas), mais si je revérifie juste après, les lignes ne sont plus là et j'ai ce message ci:

    L'énumération n'a généré aucun résultat
    J'ai ensuite laisser le programme tourner sans pas à pas et j'obtiens le même résultat (J'atterri dans le catch exactement, logique).

    J'ai fais plusieurs recherche sur le net, principalement avec l'exception en anglais qui renvoi vers plus de lien et il s'avère que je ne suis pas le seul à avoir ce soucis. Seul point noir, ses personnes n'ont pas eu de réponse claire et aucune solution n'apparaissait au final.

    (Par exemple: http://stackoverflow.com/questions/6...ata-is-present)

    Je passe finalement par un DataTable et cela marche, mais j'aimerais tout de même savoir pourquoi je ne peux récupérer mes lignes directement à l'aide du reader sans passer par un intermédiaire.

    Merci d'avance,

    PonyLee

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par PonyLee Voir le message
    Le reader.ExecuteReader() me renvoie aussi les 3 lignes (Vérifié à l'aide du pas à pas)
    Vérifié comment exactement ?

    Citation Envoyé par PonyLee Voir le message
    mais si je revérifie juste après, les lignes ne sont plus là et j'ai ce message ci
    révérifié comment ?

    Méfie toi quand tu regardes certaines variables avec le debugger, dans certains cas ça peut avoir des effets de bord imprévus (ex. lire le contenu du datareader)

    Au passage, ça sert à rien de faire un lock sur une variable locale...

  3. #3
    Futur Membre du Club
    Inscrit en
    Mai 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Vérifié comment exactement ?
    Avec le debugger, comme tu le suppose ensuite. Effectivement, cela influe sur la lecture du datareader. C'est pour cela qu'ensuite, j'ai laissé le programme se dérouler normalement et que celui-ci à générer une exception. (Exception déclenché à cause d'un cast impossible étant donné que la variable était null)

    Au passage, ça sert à rien de faire un lock sur une variable locale...
    Merci, j'avais mis un lock dans le cas le reader serait affecté par autre chose. Mais que cela ne sert à rien.

  4. #4
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Bonjour

    Quelle ligne lève l'exception ?

  5. #5
    Futur Membre du Club
    Inscrit en
    Mai 2010
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    Celle-ci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    action.setCodeTypeAction(Convert.ToInt32(reader["REP_CODE"].ToString()));
    C'est après cette ligne là:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    action.setLibelle(reader["REP_LIBELLE"].ToString());
    Que le reader se vide. (Alors que la propriété HasRows est bien à True et isClosed à False)

  6. #6
    Expert éminent
    Avatar de Immobilis
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    6 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 559
    Points : 9 512
    Points
    9 512
    Par défaut
    Salut

    Déjà, il faudrait utiliser l'instruction using correctement. Using limite la portée des variables au using seulement. A mon avis, déclarer "SqlDataReader reader = null;" est une erreur. Il faudrait faire ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    using (SqlDataReader reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            // Ton code
        }
    }
    C'est plus propre.

    Les objets "SqlConnection" et "SqlCommand" suivent le même principe car ils implémentent l'interface IDisposable.

    Correctement utilisée l'instruction using te permet de ne pas appeler les méthodes Close et Dispose: http://msdn.microsoft.com/en-us/library/yh598w02.aspx

    Par ailleurs, je te conseille de passer par des interfaces: http://dotnet.developpez.com/faq/asp...#adonet_select

    A+

Discussions similaires

  1. Poubelle qui se vide automatiquement
    Par léa93 dans le forum Windows 8
    Réponses: 0
    Dernier message: 27/02/2014, 15h40
  2. [PHP-JS] php qui s'exécute automatiquement...
    Par sam01 dans le forum Langage
    Réponses: 4
    Dernier message: 01/03/2006, 07h20
  3. Ne pas afficher un champs qui est vide dans ma BD
    Par yoda_style dans le forum ASP
    Réponses: 3
    Dernier message: 27/04/2004, 11h40
  4. [ODBC] erreur SQL pour les unions qui renvoient vide
    Par fabriceMerc dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 25/11/2003, 11h06

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