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 :

Drôle de problème avec SQLite et AsFloat


Sujet :

Bases de données Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Par défaut Drôle de problème avec SQLite et AsFloat
    Bonjour,

    J'ai une BDD SQLite3 sur laquelle je fais une requête qui doit me retourner une valeur réelle (champ "Rating2" dans les ex. ci-dessous).

    Si je fais une requête comme ça, tout va bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    with qry do begin
      SQL.Text := 'SELECT Rating2 FROM Matchs WHERE (Date < ''1912-04-01'') AND (Team1 = 9740 OR Team2 = 9740) ORDER BY DATE DESC LIMIT 1';
      Open;
     
      f := Fields[0].AsFloat;
      AddToLog(Format('Rating: %g, [f]));
    end;
    Résultat ok, affiché:
    Rating: 950,640991210938
    Mais si je fais comme ça...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    with qry do begin
      SQL.Clear;
      SQL.Add('SELECT CASE');
      SQL.Add(' WHEN Team1 = 9740 THEN Rating1');
      SQL.Add(' WHEN Team2 = 9740 THEN Rating2');
      SQL.Add('END');
      SQL.Add('FROM Matchs WHERE (Date < ''1912-04-01'') AND (Team1 = 9740 OR Team2 = 9740)');
      SQL.Add('ORDER BY Date DESC LIMIT 1;');
      Open;
     
      f := Fields[0].AsFloat;
      AddToLog(Format('Rating: %g', [f]));
    end;
    ...j'ai une exception:
    Exception class EConvertError with message ''950.640991210938' is not a valid floating point value'.
    !?!?

    Dans les deux cas, c'est la même valeur de la même ligne qui est recherchée (950.64...), pourquoi est-ce que ça provoque une exception dans le second ? J'ai également essayé avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f := StrToFloat(Fields[0].AsString);
    Pareil

  2. #2
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    à mon avis
    Rating1 = 950,640991210938
    Rating2 = 950.640991210938
    
    SQLite3 ne se préoccupant du type des colonnes, tu as du stocker une chaîne contenant une virgule à un moment donné.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Par défaut
    Justement non !?
    - D'une part mes valeurs sont bien stockées en "AsFloat" dans la table (ce sont des Single à l'origine sous Delphi).
    - Et d'autre part les deux requêtes présentées ci-dessus retournent exactement le même champ de la même ligne !
    Par contre j'ai l'impression que la deuxième requête retourne une chaîne peut-être parce que le "SELECT CASE" introduit une ambiguïté quant au type de données retournées ? (le champ retourné pouvant varier d'une requête à l'autre)
    Une autre preuve que ce n'est pas un problème de virgule/point, c'est que si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f := StrToFloat(Fields[0].AsString);
    Ça plante !
    Mais si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f := StrToFloat(Copy(Fields[0].AsString, Length(Fields[0].AsString) - 2));
    Ça marche !

    Je vais partir sur la supposition que l'ambiguïté force le retour d'un champ de type STRING et que la conversion ne passe pas parce que la chaîne est trop longue !? Et je vais limiter mes valeurs à 2-3 chiffres après la virgule parce que de toutes façon je n'ai pas besoin de plus.

    Mais si quelqu'un avait une explication, peut-être que je mourrai moins idiot...

  4. #4
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 663
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 663
    Billets dans le blog
    65
    Par défaut
    je ne connais pas cette BDD mais ? si tu forçais avec un CAST la valeur de retour ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT 
     CAST(CASE 
              WHEN Team1 = 9740 THEN Rating1
              WHEN Team2 = 9740 THEN Rating2
             END 
           AS FLOAT) AS RATING;
    .....
    ou 
    CASE 
      WHEN TEAM1=9740 THEN CAST(rating1 AS FLOAT)
      WHEN TEAM2=9740 THEN CAST(rating2 AS FLOAT)
    END
    bien sur a tester et si le CASTING existe

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Par défaut
    CAST existe, les deux formes de la requête fonctionnent (même si je pense que le deuxième reste ambiguë), mais ça plante toujours au moment de la récupération dans Delphi (f := Fields[0].AsFloat). J'ai aussi essayé avec CAST (x AS REAL)

    Ceci ne fonctionne pas non plus:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT CASE
    WHEN Team1 = 9740 THEN Rating1
    WHEN Team2 = 9740 THEN Rating2
    END * 1.0
    FROM Matchs WHERE (Date < '1912-04-01') AND (Team1 = 9740 OR Team2 = 9740)
    ORDER BY Date DESC LIMIT 1;
    Ni la variante combinée CAST et * 1.0

    J'ai aussi essayé avec ROUND(X, Y) sans plus de succès. Et puis... j'ai réalisé que mon Copy(...) était foireux, j'ai oublié un paramètre, résultat il me coupait le '.' et non la fin de la chaîne comme je le croyait ! Du coup... je m'excuse Paul Toth !!! mais c'est bien toi qui avais raison Et désolé aussi SergioMaster pour t'avoir fait perdre du temps pour rien (enfin j'aurais quand même appris quelque chose avec le CAST).
    Un petit DecimalSeparator := '.' et c'est réglé.
    Problème résolu.

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Par défaut
    Cela dit en passant... ça règle le problème de conversion string -> float, mais ça n'explique pas pourquoi dans un cas SQLite me renvoie une valeur de type float et dans l'autre une valeur de type string. Même quand j'essaye de forcer le type.

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

Discussions similaires

  1. problème avec sqlite
    Par nagca dans le forum Android
    Réponses: 1
    Dernier message: 08/06/2011, 10h08
  2. Réponses: 4
    Dernier message: 25/06/2010, 17h05
  3. Problème avec Sqlite lors de la compilation
    Par Jiyuu dans le forum Déploiement/Installation
    Réponses: 6
    Dernier message: 28/11/2009, 18h32
  4. [C#]problème avec SqLite
    Par ClaudeBg dans le forum Linq
    Réponses: 8
    Dernier message: 18/06/2009, 16h17
  5. Problème avec SQLITE
    Par Jiyuu dans le forum Django
    Réponses: 2
    Dernier message: 12/03/2009, 07h07

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