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 :

C# 1.1 problème pour stocker toutes les valeurs d'un select dans une variable [Fait]


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 82
    Points : 49
    Points
    49
    Par défaut C# 1.1 problème pour stocker toutes les valeurs d'un select dans une variable
    Bonjour,

    je fais une requête sql de type SELECT afin de pouvoir récupérer tous les id d'une table profil par rapport à l'ID d'un utilisateur, ces id je veux les stocker dans une variable, le problème que je rencontre est que le programme me renvoie que le 1er ID uniquement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    string reqIdUSER;
    reqIdUSER = "SELECT p.id FROM PROFIL AS p, Utilisateur AS u WHERE u.id = 12"; 
    string idProfil =  ConnectionString(chaineConnexion("MyDatabase","USERreader"),reqIdUSER);

  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 749
    Points
    39 749
    Par défaut
    Euh... elle fait quoi la fonction ConnectionString ? en lisant ton code, on dirait que c'est ce qui exécute la requête, mais dans ce cas le nom est très mal choisi

    Normalement on utilise un DataReader pour lire le résultat d'une requête
    http://dotnet.developpez.com/articles/ado1/

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 82
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Euh... elle fait quoi la fonction ConnectionString ? en lisant ton code, on dirait que c'est ce qui exécute la requête, mais dans ce cas le nom est très mal choisi

    Normalement on utilise un DataReader pour lire le résultat d'une requête
    http://dotnet.developpez.com/articles/ado1/

    Alors voici le code ma fonction ConnectionString :

    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
     
     
    public static string ConnectionString(string connex,string sql)
    {
    			OleDbConnection co = new OleDbConnection(connex);
    			OleDbCommand cmd;
    			OleDbDataReader dr;
    			string result = "";
     
    			cmd = new OleDbCommand(sql, co);
    			co.Open();
     
     
    			// Permet de modifier le temps max pour la connexion sql
    			cmd.CommandTimeout = varSession.ConnectTimeoutSql;
     
     
    			dr = cmd.ExecuteReader();
    			if (dr.Read() != false)
    				if (dr.IsDBNull(0) != true)
    				{
    					if (dr.GetDataTypeName(0).ToString() ==  "DBTYPE_DBTIMESTAMP")
    						result = dr.GetDateTime(0).Date.ToShortDateString();
    					else if (dr.GetDataTypeName(0).ToString() == "DBTYPE_I4")
    						result = dr.GetInt32(0).ToString();
    					else if (dr.GetDataTypeName(0).ToString() == "DBTYPE_I2")
    						result = dr.GetInt16(0).ToString();
    					else if (dr.GetDataTypeName(0).ToString() == "DBTYPE_NUMERIC")
    						result = dr.GetValue(0).ToString();
    					else if (dr.GetDataTypeName(0).ToString() == "DBTYPE_I8")
    						result = dr.GetInt64(0).ToString();
    					else
    						result = dr.GetString(0);
    				}
    			co.Close();
    			return result;
    }

    PS: pour le nom tu as raison je le changerai plus tard

  4. #4
    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 749
    Points
    39 749
    Par défaut
    Alors, je confirme, le nom de la fonction est très très très mal choisi... donner à une fonction un nom qui n'a rien à voir avec ce qu'elle fait c'est le meilleur moyen de se mélanger les pinceaux...

    A part ça, ta fonction ne lit que le premier champ de la première ligne de résultat de la requête. Pour récupérer tous les résultats, il faut faire une boucle dans laquelle tu appelles la fonction Read, jusqu'à ce qu'elle renvoie false. Ensuite, il faut savoir sous quelle forme tu veux les résultats : une liste ? une DataTable ? Une chaine avec les valeurs séparées par des virgules ? Pour une DataTable, le meilleur moyen est d'utiliser un DataAdapter (cf. ce tuto). Sinon, il faut construire la liste ou la chaine dans la boucle sur le DataReader.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 82
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Alors, je confirme, le nom de la fonction est très très très mal choisi... donner à une fonction un nom qui n'a rien à voir avec ce qu'elle fait c'est le meilleur moyen de se mélanger les pinceaux...

    A part ça, ta fonction ne lit que le premier champ de la première ligne de résultat de la requête. Pour récupérer tous les résultats, il faut faire une boucle dans laquelle tu appelles la fonction Read, jusqu'à ce qu'elle renvoie false. Ensuite, il faut savoir sous quelle forme tu veux les résultats : une liste ? une DataTable ? Une chaine avec les valeurs séparées par des virgules ? Pour une DataTable, le meilleur moyen est d'utiliser un DataAdapter (cf. ce tuto). Sinon, il faut construire la liste ou la chaine dans la boucle sur le DataReader.


    Merci pour cette affirmation c'est bien ce que je pensais.

    En ce qui concerne la forme sous laquelle je souhaite avoir mes résultats est une list je pense de type string séparé par des virgule afin de pouvoir réutiliser cette variable comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DELETE MATABLE WHERE id NOT IN (1,2,3,4,5)
    les chiffres 1,2,3,4,5 représentent le résultat de mon sélect que j'aurai stocker dans ma variable. Euh je sais pas si c'est clair

  6. #6
    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 749
    Points
    39 749
    Par défaut
    Ben dans ce cas c'est pas la peine de t'embêter à le faire en 2 requêtes, tu peux faire une sous requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE MATABLE WHERE id NOT IN (SELECT p.id FROM PROFIL AS p, Utilisateur AS u WHERE u.id = 12)
    (par contre c'est pas supporté par tous les SGBD)

    Sinon tu peux faire un truc comme ça dans ta boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    			dr = cmd.ExecuteReader();
    			StringBuilder sb = new StringBuilder();
    			while (dr.Read() != false)
    			{
    				if (!dr.IsDBNull(0))
    				{
    					if (sb.Length > 0)
    						sb.Append(", ");
    					sb.Append(dr[0].ToString());
    				}
    			}
    			...
     
    			return sb.ToString();

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 82
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Ben dans ce cas c'est pas la peine de t'embêter à le faire en 2 requêtes, tu peux faire une sous requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DELETE MATABLE WHERE id NOT IN (SELECT p.id FROM PROFIL AS p, Utilisateur AS u WHERE u.id = 12)
    (par contre c'est pas supporté par tous les SGBD)

    Sinon tu peux faire un truc comme ça dans ta boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    			dr = cmd.ExecuteReader();
    			StringBuilder sb = new StringBuilder();
    			while (dr.Read() != false)
    			{
    				if (!dr.IsDBNull(0))
    				{
    					if (sb.Length > 0)
    						sb.Append(", ");
    					sb.Append(dr[0].ToString());
    				}
    			}
    			...
     
    			return sb.ToString();


    Merci pour toutes tes réponses cela m'a bien servi je viens de tester j'ai choisi la 2ème méthode et cela fonctionne très bien.

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

Discussions similaires

  1. [AC-2003] mettre a jour toutes les valeurs d'un colonne dans une zone de liste
    Par yieiyiei dans le forum VBA Access
    Réponses: 1
    Dernier message: 29/04/2015, 22h41
  2. Problème pour lister toutes les tâches
    Par base-un dans le forum VBA Project
    Réponses: 1
    Dernier message: 03/04/2014, 20h06
  3. [MySQL] problème pour récupérer toutes les lignes contenue dans un select
    Par Baleze dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 25/10/2012, 21h42
  4. Problème pour récupérer toutes les informations d'un XML
    Par neo62matrix dans le forum Général Python
    Réponses: 2
    Dernier message: 30/03/2012, 11h55
  5. [MySQL] Requête pour récupérer toutes les valeurs d'un tableau
    Par djoumusic dans le forum PHP & Base de données
    Réponses: 40
    Dernier message: 24/08/2008, 23h11

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