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 :

Recherche explications sur : reader.GetString(i)


Sujet :

ADO.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2002
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 13
    Par défaut Recherche explications sur : reader.GetString(i)
    Bonjour,

    Je recherche en vain à utiliser correctement la fonction reader.GetString(i).

    En effet je souhaite lire des valeurs dans une base SQL et les visualiser dans des TextBoxs sous VB express.

    Le problème et que je n'arrive pas à lire les données dans l'ordre de l'index - Voici mes questions:

    Index (0) corespond à la première colonne ?index(1) deuxième ? etc.....
    Comment lire une valeur au delà de l'index (10) ?

    Je pensais que cela fonctionnait ainsi mais ça me retourne les valeurs pas dans l'ordre des colonnes.

    Merci pour vos lumières.

    BTN

  2. #2
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Par défaut
    L'index (i) correspond à la position de la colonne dans la clause SELECT.
    Donc il dépend de ce tu indiques dans cette clause et de leur ordre.

    Exemples :

    SELECT FirstName, LastName, Birthdate FROM Person FirstName : i=0, LastName : i=1, Birthdate : i=3.

    SELECT Birthdate, FirstName, LastName FROM Person FirstName : i=1, LastName : i=2, Birthdate : i=0.

  3. #3
    Membre émérite
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Par défaut
    Salut,

    L'explication de Pascal est parfaite...

    Je vais juste rajouter une méthode en .net pour gérer des colonnes...
    "SqlDataReader" possède une méthode "GetOrdinal" qui prend le nom de la colonne en paramètre et renvoie l'index.

    Reprenons l'exemple ci-dessus :
    Table : Person
    Colonnes : FirstName [string] | LastName [string] | Birthdate [DateTime]

    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
                SqlConnection connection = new SqlConnection(@"Data Source=****;Initial Catalog=****;Integrated Security=True");
                SqlCommand command = new SqlCommand("SELECT * FROM dbo.Person", connection);
                connection.Open();
                SqlDataReader reader = command.ExecuteReader();
     
                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                        int firstNameIndex = reader.GetOrdinal("FirstName");
                        string firstName = "";
                        int lastNameIndex = reader.GetOrdinal("LastName");
                        string lastName = "";
                        int birthdateIndex = reader.GetOrdinal("Birthdate");
                        DateTime? birthdate = null;
     
                        if (reader[firstNameIndex] != DBNull.Value)
                            firstName = reader.GetString(firstNameIndex);
                        if (reader[lastNameIndex] != DBNull.Value)
                            lastName = reader.GetString(lastNameIndex);
                        if (reader[birthdateIndex] != DBNull.Value)
                            birthdate = reader.GetDateTime(birthdateIndex);
     
                        Console.WriteLine("FirstName : {0} | LastName : {1} | Birthdate {2}", firstName, lastName, birthdate.HasValue ? birthdate.Value.ToShortDateString() : "");
                    }
     
                }
                connection.Close();

  4. #4
    Membre averti
    Inscrit en
    Avril 2002
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 13
    Par défaut
    Merci beaucoup. Vos explications ont répondus parfaitement à mes attentes.

  5. #5
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067
    Par défaut
    Citation Envoyé par katkiller Voir le message
    Salut,

    L'explication de Pascal est parfaite...

    Je vais juste rajouter une méthode en .net pour gérer des colonnes...
    "SqlDataReader" possède une méthode "GetOrdinal" qui prend le nom de la colonne en paramètre et renvoie l'index.

    Reprenons l'exemple ci-dessus :
    Table : Person
    Colonnes : FirstName [string] | LastName [string] | Birthdate [DateTime]

    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
                SqlConnection connection = new SqlConnection(@"Data Source=****;Initial Catalog=****;Integrated Security=True");
                SqlCommand command = new SqlCommand("SELECT * FROM dbo.Person", connection);
                connection.Open();
                SqlDataReader reader = command.ExecuteReader();
     
                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                        int firstNameIndex = reader.GetOrdinal("FirstName");
                        string firstName = "";
                        int lastNameIndex = reader.GetOrdinal("LastName");
                        string lastName = "";
                        int birthdateIndex = reader.GetOrdinal("Birthdate");
                        DateTime? birthdate = null;
     
                        if (reader[firstNameIndex] != DBNull.Value)
                            firstName = reader.GetString(firstNameIndex);
                        if (reader[lastNameIndex] != DBNull.Value)
                            lastName = reader.GetString(lastNameIndex);
                        if (reader[birthdateIndex] != DBNull.Value)
                            birthdate = reader.GetDateTime(birthdateIndex);
     
                        Console.WriteLine("FirstName : {0} | LastName : {1} | Birthdate {2}", firstName, lastName, birthdate.HasValue ? birthdate.Value.ToShortDateString() : "");
                    }
     
                }
                connection.Close();
    Une question que je me pose depuis un moment avec ce getordinal est est-ce que c'est utile de le rappeler à chaque read? ou peut être est-il mieux de le faire une seule fois au premier read? certes ça ajoute un peu de code mais si on lit plusieurs millions de ligne ça aura peut être un impact.

  6. #6
    Membre Expert Avatar de meziantou
    Homme Profil pro
    autre
    Inscrit en
    Avril 2010
    Messages
    1 223
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : autre
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2010
    Messages : 1 223
    Par défaut
    Citation Envoyé par youtpout978 Voir le message
    Une question que je me pose depuis un moment avec ce getordinal est est-ce que c'est utile de le rappeler à chaque read? ou peut être est-il mieux de le faire une seule fois au premier read? certes ça ajoute un peu de code mais si on lit plusieurs millions de ligne ça aura peut être un impact.
    Il y a un cache nom de colonne - index (classe FieldNameLookup), mais sur un millions d'éléments la recherche dans ce cache fait peut-être une différence...

  7. #7
    Membre averti
    Inscrit en
    Avril 2002
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 13
    Par défaut
    En fait j'ai toujours le même problème :

    Je n'arrive pas à retourner les index de certaines colonnes car ça retourne cette erreur :

    "L'exception indexoutofrangeexception n'a pas été gérée"

    Pourtant je suis sur d'avoir rentrer dans le code le bon nom des colonnes à interroger...

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

Discussions similaires

  1. recherche explication sur comportement partition by
    Par boutade80 dans le forum SQL
    Réponses: 5
    Dernier message: 09/12/2009, 18h07
  2. Recherche explication sur les predicats
    Par christophe D dans le forum Prolog
    Réponses: 9
    Dernier message: 06/11/2009, 21h42
  3. Recherche explication sur ADAM
    Par neuneu1 dans le forum Windows Serveur
    Réponses: 4
    Dernier message: 07/09/2008, 00h36
  4. Réponses: 2
    Dernier message: 13/12/2006, 18h57
  5. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18

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