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 :

[MYSQL] [DELPHIXE] EOLeException AdoQuery Win 7 64 bits


Sujet :

Bases de données Delphi

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Février 2003
    Messages : 7
    Points : 6
    Points
    6
    Par défaut [MYSQL] [DELPHIXE] EOLeException AdoQuery Win 7 64 bits
    Bonjour,

    J'utilise delphi XE et MySQL 5.0.51a sur windows 7 64 bits.

    Une exception est levé à la deuxième ligne:
    "Les arguments sont de type incorrect, en dehors des limites autorisées ou en conflit les uns avec les autres"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      ADOQuery1.Close;
      ADOQuery1.SQL.Text := 'select * from ma_table where id=:id';
      ADOQuery1.Parameters.Items[0].Value := 4;
      ADOQuery1.Open
    Ce code fonctionne très bien sur windows XP et delphi XE.

    J'ai bien essayé différentes connections string sans succès:
    http://www.connectionstrings.com/mysql

    Par avance merci pour votre aide...

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,

    Quel est le type de la colonne Id de la table ma_table ?

    D'autre part, pour une meilleure lisibilité du code, j''écrirais plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      ADOQuery1.Parameters.ParamValues['Id'] := 4;
      // Alternativement, pour m'assurer du type du paramètre (suivant la réponse à la question précédente)
      ADOQuery1.Parameters.ParamByName('Id').DataType := ftInteger; // ou une des valeurs TFieldType adéquate...
      ADOQuery1.Parameters.ParamByName('Id').Value := 4;
    Philippe.

  3. #3
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Bonsoir,

    En plus des recommandations de Ph.
    Pour les tables avec comportant des caractères spéciaux ou espace toujours les mettre entre crochet...

    Je ferais plutot ainsi :

    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
    With ADOQuery1 do
    begin
      SQL.Clear;
      SQL.Add('Select * From [ma_table] ');
      SQL.Add('Where id= :id ');
      Parameters.ParamByName('Id').DataType := ftInteger; // ou une des valeurs TFieldType adéquate...
      Parameters.ParamByName('Id').Value := 4;
      Try
        open;
        // ton traitement, ta récupération, tes boucles etc..
      Finally
        // éventuellement
        Close;
      end;
    end;

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Février 2003
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par BuzzLeclaire Voir le message
    Bonsoir,

    En plus des recommandations de Ph.
    Pour les tables avec comportant des caractères spéciaux ou espace toujours les mettre entre crochet...

    Je ferais plutot ainsi :

    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
    With ADOQuery1 do
    begin
      SQL.Clear;
      SQL.Add('Select * From [ma_table] ');
      SQL.Add('Where id= :id ');
      Parameters.ParamByName('Id').DataType := ftInteger; // ou une des valeurs TFieldType adéquate...
      Parameters.ParamByName('Id').Value := 4;
      Try
        open;
        // ton traitement, ta récupération, tes boucles etc..
      Finally
        // éventuellement
        Close;
      end;
    end;
    Bonjour,

    Merci pour vos recommandations et vos réponses rapides, mais l'exception est toujours générée pendant l'initialisation du paramètre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL.Add('Where id= :id ');
    Voir pile d'appel en pièce jointe.
    Images attachées Images attachées  

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Peut-il y avoir influence de la différence de casse 'id' et 'Id' entre le SQL et le ParamByName ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Février 2003
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Peut-il y avoir influence de la différence de casse 'id' et 'Id' entre le SQL et le ParamByName ?
    J'ai testé d'autres exemples en respectant scrupuleusement la casse avec le même message d'erreur.

  7. #7
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Quel est le type de ID dans ta table ? Integer ? String ? autre ?
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Février 2003
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Rayek Voir le message
    Quel est le type de ID dans ta table ? Integer ? String ? autre ?
    C'est un Integer pour cet exemple !

    J'ai trouvé ce lien :
    http://qc.embarcadero.com/wc/qcmain.aspx?d=107267
    Dans mon cas c'est la ligne 2508 ADODB.pas mais le même code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Parameter.Attributes := dwFlags and $FFFFFFF0; { Mask out Input/Output flags }

  9. #9
    Modérateur
    Avatar de Rayek
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    5 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 235
    Points : 8 504
    Points
    8 504
    Par défaut
    Pour ma part je trouve étrange que le code plante sur un SQL.Add

    Essai 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
     
    With ADOQuery1 do
    begin
      SQL.Clear;
      SQL.Add('Select * From [ma_table] ');
      SQL.Add('Where id= :id ');
      Paramcheck := True; // check les paramètres et les crées si nécessaire
      Parameters.ParamByName('Id').DataType := ftInteger; // ou une des valeurs TFieldType adéquate...
      Parameters.ParamByName('Id').Value := 4;
      Try
        open;
      Finally
        Close;
      end;
    end;
    Modérateur Delphi

    Le guide du bon forumeur :
    __________
    Rayek World : Youtube Facebook

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Février 2003
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Rayek Voir le message
    Pour ma part je trouve étrange que le code plante sur un SQL.Add

    Essai 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
     
    With ADOQuery1 do
    begin
      SQL.Clear;
      SQL.Add('Select * From [ma_table] ');
      SQL.Add('Where id= :id ');
      Paramcheck := True; // check les paramètres et les crées si nécessaire
      Parameters.ParamByName('Id').DataType := ftInteger; // ou une des valeurs TFieldType adéquate...
      Parameters.ParamByName('Id').Value := 4;
      Try
        open;
      Finally
        Close;
      end;
    end;
    L'exception est toujours levé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL.Add('Where id= :id');
    mais la requête s'exécute.

    Je suis dans une config window 7 64 bits. Tous vos exemples fonctionnent sur xp
    Si j'applique la ligne de code dans ce lien:
    http://qc.embarcadero.com/wc/qcmain.aspx?d=107267
    je n'ai plus le message d'erreur.
    Bientôt résolu...

  11. #11
    Membre du Club
    Profil pro
    Delphi 10.4
    Inscrit en
    Août 2007
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Delphi 10.4

    Informations forums :
    Inscription : Août 2007
    Messages : 51
    Points : 41
    Points
    41
    Par défaut
    Bonjour,

    peut-être cela n'a absolument rien à voir, mais pour ma part j'ai eu des problème avec le connecteur ODBC 5.1.9 Win64 ! en utilisant Delphi + ADO + ODBC alors que tout fonctionnait sous Win 7 32.

    je suis repassé à la version 5.1.8 Win64 du driver ODBC et tout fonctionne ! ...

  12. #12
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 449
    Points : 24 856
    Points
    24 856
    Par défaut
    Citation Envoyé par Rayek Voir le message
    Pour ma part je trouve étrange que le code plante sur un SQL.Add
    Ce n'est pas étrange, le Add provoque la modification du Text donc un relcalcul de Params

    le try finally du Open Close est étrange, si Open échoue, le DataSet est fermé, le Close est théoriquement inutile

    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
    With ADOQuery1 do
    begin
      Paramcheck := True; // check les paramètres et les crées si nécessaire
      SQL.BeginUpdate();
      try
        SQL.Clear;
        SQL.Add('Select * From [ma_table] ');
        SQL.Add('Where id= :id ');
      finally
        SQL.EndUpdate(); // normalement, cela déplace l'exception ici !
      end;
     
      Parameters.ParamByName('Id').DataType := ftInteger; // ou une des valeurs TFieldType adéquate...
      Parameters.ParamByName('Id').Value := 4;
     
      try
        open;
        Try
     
        finally
          Close;
        end;
      except
        ...
      end;
    end;
    Cela semble être un bug de la couche ADO avec MySQL !
    A cause d'une valeur rarement utilisée !

    Il est prévu que le fameux dwFlags ne contienne normalement que

    DBPARAMFLAGS_ISINPUT = $00000001;
    DBPARAMFLAGS_ISOUTPUT = $00000002;
    DBPARAMFLAGS_ISSIGNED = $00000010;
    DBPARAMFLAGS_ISNULLABLE = $00000040;
    DBPARAMFLAGS_ISLONG = $00000080;

    via le masque $FFFFFFF0 cela retire 1 et 2 pour correspondre à ce que la propriété _Parameter.Attributes (OLEDB) accepte

    adParamSigned = $00000010;
    adParamNullable = $00000040;
    adParamLong = $00000080;

    Mais ils ont oublié

    DBPARAMFLAGS_SCALEISNEGATIVE = $00000100;

    Voir ICommandWithParameters::GetParameterInfo

    . Soit forcer le champ ID en Unsigned
    . Soit tu passes à XE3 Update X pour avoir la correction (quand ???)
    . Soit tu regarde différente version du driver comme conseillé par steph1969, l'implémentation a pu changé, avant SCALEISNEGATIVE n'était peut-être pas précisé dans les précentes versions
    . Soit tu bidouille ton propre ADO.DB , tu peux en faire une copie modifiée, en l'incluant la copie dans ton projet, cela supplantera celle fourni avec Delphi, je l'ai fait une fois pour un projet, je préfère éviter de modifier une unité fournie

    le code proposé par Andrey Tulnov pourrait générer d'autres anomalies, si la dwFlags contient SCALEISNEGATIVE, il ne change plus du tout Attributes, cela pourrait être génant dans d'autres circonstances

    Tente

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Parameter.Attributes := dwFlags and $FFFFFFF0 and not DBPARAMFLAGS_SCALEISNEGATIVE; { Mask out Input/Output flags and negative flag }
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Parameter.Attributes := dwFlags and $FFFFFEF0; { Mask out Input/Output flags and negative flag }
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Parameter.Attributes := dwFlags and $D0; { Mask only adParamSigned, adParamNullable and adParamLong }
    Après tout 10, 40 et 80
    c'est 0001 0000, 0100 0000 et 1000 0000
    donc 1101 0000 = D0 en masque
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  13. #13
    Futur Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Février 2003
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    J'ai opté pour :
    Citation Envoyé par ShaiLeTroll Voir le message
    . Soit tu bidouille ton propre ADO.DB , tu peux en faire une copie modifiée, en l'incluant la copie dans ton projet, cela supplantera celle fourni avec Delphi, je l'ai fait une fois pour un projet, je préfère éviter de modifier une unité fournie
    et la premier solution qui répond à mes différents cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Parameter.Attributes := dwFlags and $FFFFFFF0 and not DBPARAMFLAGS_SCALEISNEGATIVE; { Mask out Input/Output flags and negative flag }
    Avec les drivers ODBC 64 bits 5.x j'ai le message d'erreur suivant :
    [Microsoft][Gestionnaire de pilotes ODBC] La source de données (DSN) spécifiée présente une incompatibilité d'architecture entre le pilote et l'application.
    Je reste en MySQL ODBC 3.51.
    Quel version de delphi steph1969 utilise ?

    Merci à tous,

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

Discussions similaires

  1. [WS 2003] Pack de langue pour Win 2003 64 Bits Version anglaise
    Par sessime dans le forum Windows Serveur
    Réponses: 1
    Dernier message: 18/11/2009, 09h18
  2. base mysql vers active directory(win serv 2008)
    Par stefdu59 dans le forum Windows Serveur
    Réponses: 2
    Dernier message: 05/05/2009, 09h03
  3. Win XP 64 bits : c'est quoi ?
    Par Chatbour dans le forum Windows XP
    Réponses: 7
    Dernier message: 27/07/2007, 20h07
  4. [MySQL 5.0 + C++ WIN 32] Où est libmysqld?
    Par Jean_Benoit dans le forum Installation
    Réponses: 5
    Dernier message: 12/09/2006, 21h43
  5. [Delphi 6][MySql 4.1.11][Win XP] - Connection vers DB MySQL
    Par florran dans le forum Bases de données
    Réponses: 15
    Dernier message: 16/06/2005, 14h30

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