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

Accès aux données Discussion :

[ADO.Net][C# 2.0] Comment récupérer d'un dataset une valeur autre qu'une chaine ?


Sujet :

Accès aux données

  1. #1
    Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    Points : 4
    Points
    4
    Par défaut [ADO.Net][C# 2.0] Comment récupérer d'un dataset une valeur autre qu'une chaine ?
    Bonjour,

    Je suis nouveau sur le forum, voici le problème qui se pose dans un programme que je dois faire pour mes cours :

    J'arrive à me connecter à ma base de données access, et j'arrive à afficher le contenu grâce à un datagridview.
    Cependant, lorsque je veux récupérer dans une variable un champ autre qu'une chaine de caractère (par exemple entier, ou datetime), je rencontre un problème,
    voici la ligne qui pose problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tempsder = ds.Tables[0].Rows[0].ItemArray.GetValue(5);
    le message d'erreur :
    Cannot implicitly convert type 'object' to 'System.DateTime'.
    Le cinquième champ de ma db est bien de type 'datetime' et ma variable 'tempsder' aussi. J'ai le même problème avec mon quatrième champ qui est de type entier. Seuls les champs de type 'string' peuvent être récupérés avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    test = ds.Tables[0].Rows[0].ItemArray.GetValue(0).ToString();
    Quelqu'un peut-il m'aider ?

    Merci beaucoup !

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    tempsder est bien en DateTime, alors il faut faire le cast de l'autre coté

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    tempsder = (DateTime)ds.Tables[0].Rows[0].ItemArray.GetValue(5);

  3. #3
    Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup !

    on m'avait vanté l'efficacité de l'aide apportée sur ce forum, mais je suis tout de même impressioné par la rapidité !

    Encore merci.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 26
    Points : 25
    Points
    25
    Par défaut
    Un petit complément pour les types:

    Quand tu déclares ton DataTable, tu précises le type contenu dans chaque colone (entier, chaine etc).
    Cela permet de bien remplir ta DataTable avec le résultat renvoyé par ta requete sur ta base de données.

    Quand tu appelles la méthode GetValue de Itemarray, celle ci te renvoie une variable de type "Object"
    ds.Table[0].Rows[0].ItemArray.GetValue(5) <= C'est un objet.

    Pourquoi un objet? comme ca quelque soit le type de ta colonne, GetValue "transformera" le type en objet, et peut donc etre appliqué sur n'importe quel type(int string etc...)

    La ligne DateTime dt = ds.[blabla].GetValue(5);
    est donc fausse car d'un côté tu as un DateTime, de l'autre un Object


    Il suffit ensuite de spécifier au compilateur le type de la variable que l'on ramene avec le GetValue grace au Cast

    (DateTime) ds.[blabla].GetValue(5)

    Si cela avait été un entier, tu aurais mis
    (Int32) ds.[blabla].GetValue(5)

    De meme que pour ta chaine tu cast en string :
    ds.[blabla].GetValue(5).ToString()
    (tu aurais pu mettre (string) ds.[blabla].GetValue(5) )

    J'espère que c'est plus clair.
    Je crois que le fait de passer un type specifique en objet s'appelle le boxing, et que l'opération inverse s'appelle l'unboxing.
    Mais je me trompe peut être.

    En tous cas voila le pourquoi du cast, si j'ai détaillé ca, c'est surtout pour que tu t'y retrouves un peu plus dans les types ^^

    Pour résumer :
    Type de ta colonne (DateTime)
    Passage dans le GetValue (Object)
    Cast en date Time : (DateTime)

    Bonne continuation ^^

  5. #5
    Candidat au Club
    Inscrit en
    Avril 2006
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Merci pour ces précisions, c'est bien plus clair dans mon esprit à présent.
    Si les profs étaient aussi clairs...

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 30/11/2006, 23h06
  2. [ADO.Net][C# 1.1] Comment utiliser OracleDataAdapter ?
    Par misa dans le forum Accès aux données
    Réponses: 2
    Dernier message: 25/01/2006, 13h26
  3. [ADO.Net][C# 2.0]Comment récupérer nom colonne PrimaryKey?
    Par superbobo dans le forum Accès aux données
    Réponses: 1
    Dernier message: 18/01/2006, 17h34
  4. [ADO.Net][C# 1.1]Comment réaliser relation pour 2 Dataset ?
    Par misa dans le forum Accès aux données
    Réponses: 2
    Dernier message: 07/01/2006, 06h55
  5. Réponses: 17
    Dernier message: 27/09/2005, 12h18

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