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 :

Requete SQL sous C# [Débutant]


Sujet :

C#

  1. #1
    Membre confirmé Avatar de fabpeden
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 131
    Par défaut Requete SQL sous C#
    Bonjour à tous,

    Je sollicite votre aide concernant un problème avec une requête SQL en C#.

    Ma requête fonctionne bien (testé sous Access). Elle fonctionne également bien en C# lorsqu'elle est de la forme suivante :

    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
     
     
    	Local_reader = Globals.Bdd.dbSendSqlQuery("SELECT SUM(TOTAL_KWH_JOUR) AS COMPTEUR_PERMANANENT "+
    				"FROM "+
    				"( "+
    				"SELECT JOUR, SUM(KWH) AS TOTAL_KWH_JOUR "+
    				"FROM "+
    				"( "+
    				"SELECT datevalue(ecoEnergie.DATE_HEURE) AS JOUR, Hour(ecoEnergie.DATE_HEURE) AS HEURE, Avg(ecoEnergie.KW_DOM) AS KWH "+
    				"FROM ecoEnergie "+	
    				"WHERE datevalue(ecoEnergie.DATE_HEURE) = '02/11/2011' "+
    				"GROUP BY datevalue(ecoEnergie.DATE_HEURE), Hour(ecoEnergie.DATE_HEURE) "+
    				") "+
    				"GROUP BY JOUR "+
    				");");
    			while (Local_reader.Read())
    			{
    				Globals.Tags.COMPTEUR_JOUR_DOM.Value = Convert.ToDouble(Local_reader[0].ToString());
    				//ListBox1.Items.Add(Local_reader[0].ToString());
    			}
    			Local_reader.Close();
    Mon soucis se situe au niveau de la date. Dans mon cas ci-dessus, je rentre ma date directement '02/11/2011'.

    Je souhaite pouvoir rentrer la date en récupérant l'heure du PC :

    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
     
     
    	Local_reader = Globals.Bdd.dbSendSqlQuery("SELECT SUM(TOTAL_KWH_JOUR) AS COMPTEUR_PERMANANENT "+
    				"FROM "+
    				"( "+
    				"SELECT JOUR, SUM(KWH) AS TOTAL_KWH_JOUR "+
    				"FROM "+
    				"( "+
    				"SELECT datevalue(ecoEnergie.DATE_HEURE) AS JOUR, Hour(ecoEnergie.DATE_HEURE) AS HEURE, Avg(ecoEnergie.KW_DOM) AS KWH "+
    				"FROM ecoEnergie "+	
    				//"WHERE datevalue(ecoEnergie.DATE_HEURE) = datevalue("+DateTime.Now.ToString()+") "+
    				"GROUP BY datevalue(ecoEnergie.DATE_HEURE), Hour(ecoEnergie.DATE_HEURE) "+
    				") "+
    				"GROUP BY JOUR "+
    				");");
    			while (Local_reader.Read())
    			{
    				Globals.Tags.COMPTEUR_JOUR_DOM.Value = Convert.ToDouble(Local_reader[0].ToString());
    				//ListBox1.Items.Add(Local_reader[0].ToString());
    			}
    			Local_reader.Close();
    Cela ne fonctionne pas, j'ai une exception.

    Auriez-vous des pistes pour me mettre sur la voie? Car je n'ai trouvé de méthode C# pour récupérer juste la date de "DateTime.now"

    Merci

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Par défaut
    Bonjour,

    met un point d'arrêt et un espion sur Datetime.now.tostring() et tu veras que tu récupères probablement : "02/11/2011 00:00:00"
    Tu peux donc créer ta chaine en concatenant "now.day", "now.month", "now.year" et les "/" qui vont bien

  3. #3
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Non! Il faut utiliser les requêtes parametrées. Faire des bidouilles de concatenation avec les dates c'est très mauvais!
    http://webman.developpez.com/article...ameter/csharp/

  4. #4
    Membre émérite Avatar de bizet
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2005
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 717
    Par défaut
    Salut

    Comme le dit Nathanael, il est très fortement conseillé d'utiliser les requêtes paramétrées.

    Sinon ton erreur est que la date du jour n'est pas entourée de simple quote.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //"WHERE datevalue(ecoEnergie.DATE_HEURE) = datevalue('"+DateTime.Now.ToString()+"') "+

  5. #5
    Membre confirmé Avatar de fabpeden
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 131
    Par défaut
    Citation Envoyé par bizet Voir le message
    Salut

    Comme le dit Nathanael, il est très fortement conseillé d'utiliser les requêtes paramétrées.

    Sinon ton erreur est que la date du jour n'est pas entourée de simple quote.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //"WHERE datevalue(ecoEnergie.DATE_HEURE) = datevalue('"+DateTime.Now.ToString()+"') "+
    Merci pour votre aide, j'ai essayé les 2 méthodes, celle ci-dessus + la concaténation avec now.day..., et dans les 2 cas cela ne fonctionne pas.

    Je suis en train de regarder avec les requêtes paramétrées.

    Merci

    Je viens d'essayer avec DateTime.Now.ToString().Remove(11) mais pas mieux.

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 793
    Par défaut
    Effectivement les requêtes paramétrées sont bien sur l'idéal, mais ça n'explique aucunement pourquoi ça ne fonctionne pas (curiosité )

  7. #7
    Membre émérite Avatar de bizet
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2005
    Messages
    717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 717
    Par défaut
    En regardant ca de plus pres, je pense que tu ne devrais pas utiliser le datevalue.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    //"WHERE ecoEnergie.DATE_HEURE = ' "+DateTime.Now.ToString()+" ') "+
    Tu peux aussi mettre un point d’arrêt sur la requête et l'exécuter directement sur la base pour voir l'erreur retournée.

  8. #8
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 822
    Par défaut
    D'accord avec Bizet. Tu récupères la requête réellement envoyée, et tu regardes ce qui est écrit. Au cas où tu l'exécutes dans le requêteur du SGBD...
    S'il y a une erreur de syntaxe, tu la verras directement.

    TOUJOURS tester ses requêtes avant de les utiliser

  9. #9
    Membre confirmé Avatar de fabpeden
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 131
    Par défaut
    Bonjour à tous, bon j'ai réussi à trouver mon erreur.

    Il fallait écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    "WHERE datevalue(ecoEnergie.DATE_HEURE) = '"+DateTime.Today.ToString("d")+"' "+
    Merci encore

  10. #10
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Par défaut
    Citation Envoyé par fabpeden Voir le message
    Bonjour à tous, bon j'ai réussi à trouver mon erreur.

    Il fallait écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    "WHERE datevalue(ecoEnergie.DATE_HEURE) = '"+DateTime.Today.ToString("d")+"' "+
    Merci encore
    Non! Non! Non! Non et encore non! Je répète encore une fois qu'il faut passer par un paramètre. Faire ce genre de magouilles avec les dates n'apporte que des problèmes. Il faut BANNIR les concaténations pour faire des requêtes. En plus d'être DANGEREUX (injection SQL), cela empêche la réutilisation des plans d'executions ce qui POURRI les perfs!

  11. #11
    Membre confirmé Avatar de fabpeden
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    131
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 131
    Par défaut
    Oui, merci.

    Mais en fait dans un premier temps, je voulais comprendre pourquoi en direct cela ne fonctionnait pas.

    Maintenant je vais pouvoir m'attaquer au passage par paramètres.

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

Discussions similaires

  1. [VBA-E] Requete SQL sous Excel
    Par climz dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 22/05/2006, 14h05
  2. Recherche de requete sql sous access
    Par climz dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 15/05/2006, 09h16
  3. [sql]Probleme de count dans une requete sql (sous access)
    Par castelligreg dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 14/04/2006, 16h06
  4. Problème avec une requete SQL sous access
    Par Luther13 dans le forum Requêtes et SQL.
    Réponses: 12
    Dernier message: 14/12/2005, 10h39
  5. Optimiser une Requetes SQL sous ASP
    Par NeHuS dans le forum ASP
    Réponses: 8
    Dernier message: 18/04/2005, 16h26

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