2017-10-01 3 views
3

J'ai une instruction SQL dans une TFDQuery liée à une base de données SQLite3. Si j'effectue la requête suivante, cela fonctionne correctement si les lignes qui répondent à la clause WHERE. Dans ce cas, MyMield est un flottant et lorsque je pré-compile les champs de la table en utilisant l'éditeur de champ, il apparaît correctement comme TFloatField. Toutefois, s'il n'y a pas de lignes correspondantes (résultat vide), MyMaxField est renvoyé en tant que TWideStringField. Cela ne correspond pas au type d'objet de champ que j'ai créé lors de leur conception et retourne et erreur (même au moment du design). J'ai également essayé d'utiliser la méthode max() pour REAL et elle échoue toujours.SQLite renvoie TWideStringField pour les fonctions d'agrégation NULL

Delphi 10,2

+0

Je pense que vous devez gérer cela à partir de votre code Delphi. Si le résultat est un ensemble vide, il n'y a pas grand chose à faire du côté SQLite. –

Répondre

4

Ceci est décrit dans Adjusting FireDAC Mapping chapitre du manuel SQLite de FireDAC:

Pour une expression dans une liste SELECT, SQLite évite le nom du type informations. Lorsque le jeu de résultats n'est pas vide, FireDAC utilise la valeur types de données du premier enregistrement. Lorsqu'il est vide, FireDAC décrit les colonnes comme dtWideString. Pour spécifier explicitement le type de données de la colonne, append ::<type name> à l'alias de colonne:

SELECT count(*) as "cnt::INT" FROM mytab

Donc, pour résoudre votre problème simplement spécifier le type de données pour votre colonne d'expression. Par exemple:

SELECT 
    MAX(MyField) AS "MyMaxfield::REAL" 
FROM 
    MyTable 
WHERE 
    MyOtherFfield = 10 
+0

Ce q & a n'est-il pas un duplicata de https://stackoverflow.com/questions/44769558/tfdquery-and-sqlite-type-mismatch-for-field-expecting-largeint-actual-widest? – MartynA

+0

@MartynA, la solution est la même. En fait, j'ai jeté un double vote proche ici et j'ai attendu un moment. Comme personne d'autre n'a voté, je me suis rétracté et j'ai posté une réponse. [Je voulais que l'ancienne question soit plus générale] (https://stackoverflow.com/review/suggested-edits/16741951), mais ma proposition d'édition a été refusée. Donc, je suis un peu confus quoi faire maintenant. Dois-je répondre, voter de près, ou rendre l'ancienne question plus générale et voter de près? – Victoria

+0

Eh bien, je viens de marquer celui-ci comme un doublon, apparemment avec succès. Mais je suis déconcertée pourquoi votre modification pour améliorer votre réponse sur l'autre q aurait dû être rejetée, parce que, évidemment, il devrait mieux faire une bonne réponse. Pourquoi ne pas essayer encore et laissez-moi savoir et je voterai pour cela? – MartynA