2008-12-24 10 views
2

J'ai une requête dans Delphi en utilisant DBExpress TSQLQuery qui ressemble sierreur de troncature String dans Delphi DBExpress/Firebird paramatised requêtes

ActiveSQL.sql.add('SELECT * FROM MYTABLE where MYFIELD=(:AMYFIELD) '); 

ActiveSQL.ParamByName('AMYFIELD').AsString := 'Some random string that is to long for the field'; 

ActiveSQL.Open; 

Si je le lance, quand il exécute la commande ouverte, je reçois l'exception suivante

en classe TDBXError avec le message 'exception arithmétique, dépassement numérique ou troncature de chaîne.

Ceci est causé par la chaîne dans AMYFIELD été plus longue que les tables longueur du champ, MyField est Varchar (10), Si je la réduire à une chaîne plus courte, il fonctionne bien, et si j'ajouter la chaîne directement dans SQL comme si

ActiveSQL.sql.add('SELECT * FROM MYTABLE where MYFIELD="Some random string that is to long for the field" '); 

il fonctionne correctement, à savoir ne se plaint pas de la troncature, maintenant si cela était un insert/mise à jour, je voudrais savoir sur la troncature, mais comme vient d'être utilisé pour une recherche I aimerais l'arrêter.

Y at-il un moyen de dire à DBExpress que je peux tronquer mes chaînes? ou est-il un travail autour de cette pratique

Je voudrais éviter d'avoir à ajouter quelque chose comme

l_input: = copie (l_input, 0, fieldLength-1);

comme semble mal et rendrait le maintien du code plus difficile. J'utilise Delphi 2007 avec Firebird 2 via le pilote interbase si cela peut aider?

MISE À JOUR:

@Erick Sasse il ressemble à votre droite, j'ai trouvé le message d'erreur sur le site FAQ firebird http://www.firebirdfaq.org/faq79/

@inzKulozik le LeftStr fonctionne très bien, même si je ne peux pas ActiveSQL.ParamByName ('AMYFIELD '). Taille à travailler, mais cela me semble toujours désordonné, et plus difficile à maintenir.

J'ai vu aussi une méthode qui ajoute substr à SQL: quelque chose comme

select * from mytable where myname = substr(:MYNAME,0,10) 

regarde encore plus difficile à maintenir, Idéalement je voudrais un paramètre de configuration Firebird/DBExpress qui résout ce problème, mais jusqu'à ce que je Je peux en trouver un avec la solution d'inzKulozik et j'espère que la structure de la table ne changera pas beaucoup.

+0

Peut-être que vous devriez définir la limite de longueur maximale dans les contrôles utilisateur? – inzKulozik

Répondre

2
l_input := copy(l_input,**0**,fieldLength-1); 

Vous ne pouvez pas copier la sous-chaîne à partir de la position 0!

Essayez ceci:

l_input := LeftStr(l_input, fieldLength); 

ou

ActiveSQL.ParamByName('AMYFIELD').AsString := LeftStr('Some random string that is to long for the field', ActiveSQL.ParamByName('AMYFIELD').Size); 

ou

with ActiveSQL.ParamByName('AMYFIELD') do 
    AsString := LeftStr('Some random string that is to long for the field', Size); 
+0

Je ne savais pas à propos de leftStr, je vais y aller lundi – Re0sless

1

Ce message d'erreur est de Firebird, non DBX. Je pense que DBX envoie les paramètres à la base de données exactement de la façon dont vous l'entrez, donc cela devrait être un travail Firebird pour le tronquer.

Questions connexes