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 :

Problème between date


Sujet :

ADO.NET

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 12
    Points : 9
    Points
    9
    Par défaut Problème between date
    Bonsoir,

    j'ai un problème d'affichage des données pour les dates comprises entre les valeurs de 2 datetimepicker.

    Le problème est que même si je change le format des datetimepickervalue en MM/dd/yyyy j'arrive pas à afficher les données souhaitées.

    J'utilise access et j'ai essayé pas mal de solutions trouvées sur net: le chagement de format avec Format(), les requêtes paramétrées.

    J'ai essayé aussi de forcer la saisie de mon champs date en format dd/MM/yyyy mais ça ne change rien
    Mon code:
    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
     
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     
            Dim Mycmd As New OleDbCommand
            Dim cmdSomme As New OleDbCommand      
            Try
                If Not MyConnexion.State = ConnectionState.Open Then
                    MyConnexion.Open()
                End If
                Mycmd.Connection = MyConnexion
                cmdSomme.Connection = MyConnexion
                Mycmd.CommandText = "SELECT DateFact, NumFacture, RefTapis, CtrlTapis, Prix, Commission, Somme From Vente " & _
                                    " WHERE (DateFact > #" & Format(DateTimePicker1.Value, "yyyy/MM/dd") & "# and DateFact < #" & Format(DateTimePicker2.Value, "yyyy/MM/dd") & "#)" & _
                                    " AND " & "(IdPersonnel = " & Me.ComboBox1.Text & ")"
     
                Dim da As New OleDbDataAdapter(Mycmd.CommandText, MyConnexion)
                Dim dt As New DataTable
                da.Fill(dt)
                Me.DataGridView1.DataSource = dt
                MyConnexion.Close()
            Catch ex As Exception
                MsgBox("Message d'erreur : " & ex.Message)
            End Try
        End Sub
    Si la date est 11/02/2013 , la date de facture enregistrée est sous le format 02/11/2013, et meme si je change le format des datetimepickers, les données ne sont affichées que lorsque je sélectionne le 02 novembre 2013 :s

    merci pour votre aide

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    En premier lieu, ton code est sensible à de l'injection SQL.

    En gros en écrivant le text qui va bien dans le textbox, c'est possible de supprimer toutes tes bases !

    Je te recommande donc d'utiliser des requêtes paramétrées (accessoirement ça devrait résoudre ton problème de format de date).

    Sinon je te conseille de récupérer la string correspondant à ta requête, puis de tester son fonctionnement directement sous Access. Lors de tes tests, utilise toujours des jours > 13 afin d'être sur que de l'autre coté il a compris correctement le format de ta date.

    Le 01.02.2012, ça peut être le 1 février ou le 2 janvier. Le 20.01.2012 ça peut être le 20 janvier ou une erreur ! C'est beaucoup plus simple de détecter une erreur d'execution sql qu'une erreur fonctionnel (Le logiciel ne plante pas mais ne fait pas ce qu'il doit faire) !

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Merci pour votre réponse

    Mais j'ai pas compris ce que vous voulez dire avec :
    En gros en écrivant le text qui va bien dans le textbox, c'est possible de supprimer toutes tes bases !
    Merci de m'expliquer je suis encore novice et je découvre encore les requêtes paramétrées

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Points : 2 201
    Points
    2 201
    Par défaut
    Exemple très simple:

    Si votre textbox contient par exemple la chaîne suivante: "0) OR (True" Alors votre requête final devient:

    "SELECT DateFact, NumFacture, RefTapis, CtrlTapis, Prix, Commission, Somme From Vente WHERE (DateFact > #01/20/2012# AND DateFact < #12/31/2012#) AND (IdPersonnel = 0) OR (True)"

    Du coup le OR (True) à la fin de la requête permet d'avoir une condition toujours vraie dans le WHERE. En gros votre requête a été transformée en "SELECT DateFact, NumFacture, RefTapis, CtrlTapis, Prix, Commission, Somme From Vente".

    En continuant sur cette idée il devient possible de faire executer n'importe quel requête directement sur la base de donnée (y.c. des Drop Table, des delete etc...).

    Il faut donc s'assurer que la valeur de Me.ComboBox1.Text soit effectivement un chiffre et non pas une chaîne de caractères. Dans le cas la requête a besoin d'une chaîne de caractère, il faut penser à doubler les apostrophes simple pour éviter un problème similaire.

    L'utilisation de requêtes avec des paramètres permet d'éviter ce genre de problème.

    Dans votre cas l'application plantera lors de l'affectation de la valeur Me.ComboBox1.Text à un paramètre de type Integer (si ce dernier n'est pas un chiffre) et évitera des manipulations non désirées de la base.

    Donc pour résumer:

    1. Il faut sécuriser ses requêtes en vérifiant que les valeurs dynamique qu'on injecte corresponde à l'utilisation prévue (test sur variable).

    2. L'utilisation de requêtes paramétrées permet de garantir le point précédant.

    3. Donc soit on est très attentif et on écrit les lignes de test pour les variables à chaque requête (et on finira forcément par oublier de le faire une fois). Soit on utilise systématiquement des requêtes paramétrées.

    Attention l'utilisation de paramètre ne doit pas vous empêcher d'effectuer les tests de validation de la saisie de l'utilisateur. Sinon gare aux Exceptions non gérées qui font planter le programme !

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Inscrit en
    Janvier 2012
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Janvier 2012
    Messages : 12
    Points : 9
    Points
    9
    Par défaut
    Merciii infiniment sinople maintenant je vois bien ce que vous avez dit

Discussions similaires

  1. problème avec between date
    Par jeanpierre215 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/09/2010, 18h58
  2. Problème de date sur la fonction BETWEEN
    Par Fcapitaine dans le forum SQL
    Réponses: 3
    Dernier message: 06/08/2010, 18h24
  3. [AC-2000] Problème avec date et between
    Par Titiii25 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 03/11/2009, 10h14
  4. Problème de date dans un between
    Par Abac_Angelique dans le forum Langage SQL
    Réponses: 12
    Dernier message: 13/12/2007, 21h57
  5. Problème de date avec between
    Par sebac dans le forum Access
    Réponses: 3
    Dernier message: 29/06/2007, 21h16

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