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

Bases de données Delphi Discussion :

Erreur de passation de paramètre (de type date) à une requête AdoQuery


Sujet :

Bases de données Delphi

  1. #1
    Membre du Club
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 101
    Points : 64
    Points
    64
    Par défaut Erreur de passation de paramètre (de type date) à une requête AdoQuery
    Salut tout le monde

    J’ai un sérieux problème lors de la passation de paramètres (de type date) à une requête AdoQuery sur une base de donnée Access, voici 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
     
    procedure Tlistcomform.b1Click(Sender: TObject);
    var req :string ;
    begin
    q.paramcheck:=false;
    req :='select * from commande where datcom between :dd1 and :dd2';
    q.close;
    q.sql.clear;
    q.sql.add(req);
    q.Parameters.ParamByName('dd1').Value:=d1.Date;
    q.Parameters.ParamByName('dd2').Value:=d2.Date;
    q.open;q.first;
    end ;
    Message d’erreur suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    q : parametres 'dd1' non trouvés
    j’ai éssayé avec mais avec le même message d’erreur !
    Aidez moi SVP et merci d’avance

  2. #2
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 170
    Points
    4 170
    Par défaut
    Avec ADO, les paramètres se définissent avec "?" et non pas aramName. Le composant TADOQuery doit remplacer automatiquement les ":" par ? mais le nom du paramètre est supprimé.

    Références tes paramètres par index et non pas par nom. De plus, je crois qu'il faut remplir la collection Parameters manuellement.

    Quelques petites remarques autres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    q.sql.clear;
    q.sql.add(req);
    Tu as aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    q.sql.Text := req;
    Ca évite de devoir faire le Clear avant...

    Le first ne sert à rien. Quand tu ouvres la requête, tu seras automatiquement positionné sur le premier enregistrement.

  3. #3
    Membre du Club
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 101
    Points : 64
    Points
    64
    Par défaut indice de liste hors limite(0)!
    je vous remercie de m'avoir répondu
    sauf que le problème ne s'est pas encore réglé, j'au essaié les deux alternatives possibles (avec un seul paramètre uniquement):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    req :='select * from commande where datcom > ?dd1 ';
    q.close;
    q.sql.text(req);
    q.Parameters.Items[0].Value:=d1.Date;
    q.open;
    puis:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    req :='select * from commande where datcom > :dd1 ';
    q.close;
    q.sql.text(req);
    q.Parameters.Items[0].Value:=d1.Date;
    q.open;
    mais toujours avec le message d'erreur suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    indice de liste hors limite(0)
    je demande si quelqu'un pourrait nous donner un coup de main (reproduire correctement mon code source si possible).
    et merci d'avance

  4. #4
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 170
    Points
    4 170
    Par défaut
    Non tu n'as pas compris, tu ne peux plus donner de nom aux paramètres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    req :='select * from commande where datcom > ? ';
    Cependant, je viens de vérifier le composant TADOQuery créera les paramètres dans la collection Parameters uniquement si :
    - ParamCheck vaut true.
    - Le composant TADOQuery est relié à une connexion (propriété Connection, ou ConnectionString définie).
    - Les paramètres ont été définit avec la syntaxe ":". Mais attention, si tu utilises deux fois le même nom de paramètre dans la requête, il ne comprendra pas que tu veux utiliser deux fois le même paramètre. Il créera deux paramètres différents, avec le même nom. Ce qui provoquera une erreur. De plus ensuite, le nom du paramètre est remplacé dans la requête par ?, et ADO ne fera le binding entre le paramètre et ça valeur qu'à partir de sa position dans la requête et de sa position dans Parameters.

    Si toutes ces conditions sont respectées, les paramètres doivent être créés automatiquement dans Parameters, lorsque tu modifies le contenu de la requête (la collection SQL est modifiée) (Au fait, pas besoin de fermer la requête avant de modifier SQL, sa modification entraîne la fermeture automatique du composant).

    Donc ça devrait fonctionner avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    q.paramcheck := true;
    req :='select * from commande where datcom between :dd1 and :dd2';
    q.sql.Text := req;
    q.Parameters[0].Value := d1.Date;
    q.Parameters[1].Value := d2.Date;
    q.open;
    Sinon, tu peux aussi essayer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    q.sql.text := req;
    q.Parameters.ParseSQL(req, true); // Le parametre true demande la création des TParameter trouvé dans req.
    q.Parameters[0].Value := d1.Date;
    q.Parameters[1].Value := d2.Date;
    q.open;

  5. #5
    Membre du Club
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 101
    Points : 64
    Points
    64
    Par défaut merci king!
    finalement voila ce que j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    req :='select * from commande where datcom between :dd1 and :dd2';
    q.sql.Text := req;
    q.Parameters.ParseSQL(req, true); 
    q.Parameters[0].Value := datetostr(d1.Date);
    q.Parameters[1].Value := datetostr(d2.Date);
    q.open;
    ça à très bien marché, merci encore a vous et a vos réponses claires, mais surtout détaillées

  6. #6
    Expert confirmé

    Profil pro
    Leader Technique
    Inscrit en
    Juin 2005
    Messages
    1 756
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Leader Technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 756
    Points : 4 170
    Points
    4 170
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    q.Parameters[0].Value := datetostr(d1.Date);
    q.Parameters[1].Value := datetostr(d2.Date);
    Ca je te le déconseille. Il ne faut pas convertir tes dates en texte pour le passage de la valeur, mais bel et bien affecter directement la date.
    Par contre, il faut typer le paramètre pour en faire un type date.

    Si tu passes la valeur du paramètre avec du texte, tu prends le risque que le SGBD ne reconnaisses pas le format de date utilisé (par exemple tu as un SGBD us et un client fr). Tu n'as peut-être pas le problème dans ton cas de figure, mais dans le cas général, l'intérêt du paramètre (entre autre), c'est justement de passer la valeur sans te soucier de sa représentation sous forme textuelle.

    Tu devrais plutôt faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    q.Parameters[0].Value := d1.Date;
    q.Parameters[1].Value := d2.Date;
    et au besoin s'il ne reconnait pas le type correctement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    q.Parameters[0].DataType := ftDateTime;
    q.Parameters[0].Value := d1.Date;
    q.Parameters[1].DataType := ftDateTime;
    q.Parameters[1].Value := d2.Date;

  7. #7
    Membre du Club
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 101
    Points : 64
    Points
    64
    Par défaut
    Merci encore pour l’excellente orientation, je l’ai fait comme vous avez commander, mais cette fois-ci avec un « petit problème », que je vais le détaillé comme suit :

    Dans ma base de donnée (sous ACCESS) de dispose d’une table commande dont les valeur sont comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Numcom   datcom       Mtt     
    0000001 |01/05/2008|150 £ |
    0000002 |02/05/2008|120 £ |
    Pour l’appel de la requête via le code j’ai mis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    q.Parameters[0].DataType := ftDateTime;
    q.Parameters[0].Value := d1.Date;
    q.Parameters[1].DataType := ftDateTime;
    q.Parameters[1].Value := d2.Date;
    La requête s’exécute sans erreur, mais avec un décalage de filtre :
    C'est-à-dire :
    Lorsque j’affecte à mes dateTimePicker d1 et d2 les valeurs respectives: ‘01/05/208’ et ‘02/05/2008’, la requête revoie un résultat vide !
    Sachant que pour afficher mes deux commandes il faut que j’affecte respectivement à d1 et d2 (de type TDateTimePicker) les valeurs suivantes :’01/05/2008’ et ‘05/05/2008’ pour que la requête m’affiche les commandes :
    0000001 du 01/05/2008 et 0000002 du 02/05/2008

    Vous avez bien fait d’attirer mon attention pour le format de la date qui diffère d’un SGBD à un autre, la preuve je travail sous ACCESS en mono-post dont la date est sous le format ‘jj/mm/aaaa’ alors que je vais en deuxième étape migrer ver une BDD ORACLE (pour le client SERVER) dont le format de la date est du genre 01-mar-2008 ou 01-jan-2008 ..etc, la différence est clairement visible sur les séparateurs et le format du mois.

Discussions similaires

  1. [WD10] Passer paramètres de type Date à une requête
    Par rinuspro dans le forum WinDev
    Réponses: 2
    Dernier message: 27/05/2009, 18h31
  2. RS/MDX Paramètre de Type Date
    Par dream_rachid dans le forum SSAS
    Réponses: 1
    Dernier message: 29/01/2009, 17h45
  3. [C# .NET 2.0] Paramètre de type DATE de FireBird
    Par juniorAl dans le forum Windows Forms
    Réponses: 2
    Dernier message: 28/10/2008, 14h05
  4. execute statement et paramètre de type date
    Par aallal dans le forum SQL
    Réponses: 7
    Dernier message: 19/09/2007, 17h51
  5. [ADO] Passage de paramètre de type Date dans une requête
    Par e-ric dans le forum Bases de données
    Réponses: 6
    Dernier message: 25/01/2006, 12h36

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