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

VB.NET Discussion :

Limite requete parametrée


Sujet :

VB.NET

  1. #1
    Membre éclairé Avatar de DeWaRs
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 291
    Par défaut Limite requete parametrée
    Bonjour à tous.

    je fait face à un problème qui me dépasse ... Avec le code suivant :

    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
      MyDate = dteMonth & "/" & dteDay & "/" & dteYear
     
            Dim sqlConn As SqlConnection = New SqlConnection(strConnection)
            Dim SQLStmt As String = "SELECT tblAccessoriesBook.IdAccessoriesBook " & _
                                    "FROM tblAccessoriesBook INNER JOIN " & _
                                    "tblAccessories ON tblAccessoriesBook.IdAccessories = tblAccessories.IdAccessories INNER JOIN " & _
                                    "tblGroups ON tblAccessories.IdGroups = tblGroups.IdGroups " & _
                                    "WHERE (tblGroups.AutoMailHour = '" & DateTime.Now.Hour & ":00" & "') AND IsReturn = '0' AND IsAttribution = '0' AND ReturnDate < '" & MyDate & "' AND tblGroups.IdCountry = '1' AND " & DateTime.Now.DayOfWeek.ToString & " = 'True' "
            Dim cmdGetRequestor As SqlCommand
            Dim dtrSubject As SqlDataReader
            Dim email As String = ""
            sqlConn.Open()
            cmdGetRequestor = New SqlCommand(SQLStmt, sqlConn)
            dtrSubject = cmdGetRequestor.ExecuteReader
            While dtrSubject.Read()            SendNotReturnMailAccessories(dtrSubject("IdAccessoriesBook").ToString)
            End While
            dtrSubject.Close()
     
            sqlConn.Close()
    Ma fonction SendNotReturnMailAccessories est bien appelée (la requete SQL me retourne 6 ligne)

    Mais avec le code suivant, et des requetes paramétrées

    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
            MyDate = dteMonth & "/" & dteDay & "/" & dteYear
     
            Dim sqlConn As SqlConnection = New SqlConnection(strConnection)
            Dim SQLStmt As String = "SELECT tblAccessoriesBook.IdAccessoriesBook " & _
                                    "FROM tblAccessoriesBook INNER JOIN " & _
                                    "tblAccessories ON tblAccessoriesBook.IdAccessories = tblAccessories.IdAccessories INNER JOIN " & _
                                    "tblGroups ON tblAccessories.IdGroups = tblGroups.IdGroups " & _
                                    "WHERE (tblGroups.AutoMailHour = @Hour) AND IsReturn = '0' AND IsAttribution = '0' AND ReturnDate < @ReturnDate AND tblGroups.IdCountry = '1' AND @CurrentDay = 'True' "
            Dim cmdGetRequestor As SqlCommand
            Dim dtrSubject As SqlDataReader
            Dim email As String = ""
            sqlConn.Open()
            cmdGetRequestor = New SqlCommand(SQLStmt, sqlConn)
            cmdGetRequestor.Parameters.AddWithValue("@Hour", DateTime.Now.Hour & ":00")
            cmdGetRequestor.Parameters.AddWithValue("@ReturnDate", MyDate)
            cmdGetRequestor.Parameters.AddWithValue("@CurrentDay", DateTime.Now.DayOfWeek.ToString)
            dtrSubject = cmdGetRequestor.ExecuteReader
            While dtrSubject.Read()
                SendNotReturnMailAccessories(dtrSubject("IdAccessoriesBook").ToString)
            End While
            dtrSubject.Close()
     
            sqlConn.Close()
    Ma requete SQL ne retourne rien. Je ne vois pas mon erreur ...

    Quelqu'un a-t-il une idée ?

    Cordialement.

    DeWaRs

  2. #2
    Membre Expert Avatar de callo
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 887
    Par défaut
    A première vue, le problème devrait se trouver au niveau de @CurrentDay dans ton instruction. Dans
    tblGroups.IdCountry = '1' AND @CurrentDay = 'True'
    , le paramètre devrait être au niveau de la valeur du champ. Alors que tu as paramétré plutôt le champ. A mon avis, tu devrais avoir CurrentDay = 'True' et non @CurrentDay = 'True'.
    Enfin, je ne sais pas si ma remarque est correcte. Peut-être que d'autres esprits plus avisés y verront plus clair

  3. #3
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Par défaut
    Ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "... AND " & DateTime.Now.DayOfWeek.ToString & " = 'True' "
    et ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "... AND @CurrentDay = 'True' "
    est très différent.

    Dans le premier exemple, une fois exécuté, c'est cette commande qui est envoyée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "... AND vendredi = 'True' "
    alors que dans la seconde se sera :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "... AND 'vendredi' = 'True' "
    ce qui vaura tout les temps FALSE et qui renverra donc toujours 0 ligne.

    Il ne faut pas utiliser de paramètre pour un nom de colonne mais uniquement pour son contenu.

    EDIT : c'est presque ça callo

  4. #4
    Membre éclairé Avatar de DeWaRs
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 291
    Par défaut
    Merci de vos réponses.
    Concernant cette remarque :

    Citation Envoyé par Sankasssss Voir le message


    Il ne faut pas utiliser de paramètre pour un nom de colonne mais uniquement pour son contenu.

    EDIT : c'est presque ça callo
    Il n'y a donc pas de solution pour passer "proprement" un nom de colonne en paramètre ? Est-ce parce que ce n'est simplement pas gérer par le framework ou alors parce que cela ne ce fait habituellement pas, programmaticalement parlant ?

    Cordialement.

    DeWaRs

  5. #5
    Membre Expert Avatar de callo
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2004
    Messages
    887
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Togo

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Service public

    Informations forums :
    Inscription : Février 2004
    Messages : 887
    Par défaut
    Citation Envoyé par DeWaRs Voir le message
    Il n'y a donc pas de solution pour passer "proprement" un nom de colonne en paramètre ? Est-ce parce que ce n'est simplement pas gérer par le framework ou alors parce que cela ne ce fait habituellement pas, programmaticalement parlant ?
    A mon avis, tu peux contourner, mais en terme de bonnes pratiques, je ne sais pas si c'est safe. Un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT CASE @TonParam
    WHEN 4 THEN Vendredi
    WHEN 5 THEN Samedi
    WHEN 6 THEN Dimanche
    END

  6. #6
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Par défaut
    Pour moi et dans ce cas, rien n'interdit de passer par de la concaténation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            Dim nameColDay As String() = {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"}
     
            Dim SQLStmt As String = "SELECT tblAccessoriesBook.IdAccessoriesBook " & _
                            "FROM tblAccessoriesBook INNER JOIN " & _
                            "tblAccessories ON tblAccessoriesBook.IdAccessories = tblAccessories.IdAccessories INNER JOIN " & _
                            "tblGroups ON tblAccessories.IdGroups = tblGroups.IdGroups " & _
                            "WHERE (tblGroups.AutoMailHour = @Hour) AND IsReturn = '0' AND IsAttribution = '0' " & _
                            " AND ReturnDate < @ReturnDate AND tblGroups.IdCountry = '1' AND " & nameColDay(Now.DayOfWeek) & " = 'True' "
    Pourquoi? Le type reçu est un type Date et on ne pourra jamais faire de l'injection avec (d'autant plus qu'il provient du système). Cela ne nuit pas non plus au performance donc pas de soucis.

    Remarque aussi que je passe par un tableau pour les colonnes car si la culture du PC sur lequel tourne l'application n'est pas la même que toi, ton application ne fonctionnera plus car Now.DayOfWeek.ToString sera dans la langue du PC, par exemple Monday.

  7. #7
    Membre éclairé Avatar de DeWaRs
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Décembre 2006
    Messages
    291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 291
    Par défaut
    Ok, merci pour vos retours, tout est clair a présent. L'application est destiner à tourner sur une seule machine (il s'agit d'une routine d'envoie de mail), donc pas de risque au niveau de la confusion des jours.

    Merci encore

    DeWaRs

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

Discussions similaires

  1. Requete parametré a affiché
    Par kaiser59 dans le forum ASP
    Réponses: 7
    Dernier message: 01/02/2007, 14h12
  2. Requete parametrée par un formulaire
    Par kimar dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 12/07/2006, 16h42
  3. Réponses: 2
    Dernier message: 18/04/2006, 10h44
  4. Requete parametrée avec CristalReport de VB6?
    Par bonsam dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 13/12/2005, 09h22
  5. Requete parametrée TADOQuery
    Par cdlr27 dans le forum Bases de données
    Réponses: 3
    Dernier message: 01/05/2004, 18h41

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