2009-10-21 6 views
3

Je reçois une "erreur SQL Server: exception arithmétique, dépassement numérique ou troncature de chaîne" erreurPiégeage Exception en utilisant TSQLQuery & params

est le code ci-dessous

AQuery:= TSQLQuery.Create(nil); 
with AQuery do 
begin 
SQLConnection:- AConnection; 
SQL.Text:= 'Insert into.....'; 
ParamByName('...').asString:= 'PCT'; 
. 
. 
. 

try 
    ExecSQL; 
finally 
    AQuery.Free; 
end; 
end; 

J'ai beaucoup de ParamByName lignes, et je ne peux pas savoir lequel lance l'exception. Je sais juste qu'il est lancé sur la ligne ExecSQL. Comment puis-je savoir quel paramByName provoque l'erreur?

+4

Sans voir ces paramètres et interroger, c'est difficile à dire. –

Répondre

0

Vous essayez d'insérer une valeur de chaîne dans un champ qui n'est pas assez grand pour contenir la valeur. Vérifiez la longueur des valeurs que vous insérez par rapport à la longueur du champ dans la table.

+0

C'est l'une des trois possibilités énumérées. La lecture du message d'erreur que l'OP reçoit vous donne les deux autres. –

1

Récupère le texte SQL après la substitution de paramètres et l'exécute en tant que requête dans SQL Server Management Studio.
Vous serez en mesure de déboguer à partir de là.

2

Lorsque vous avez les métadonnées de la table, vérifiez la longueur maximale des champs de chaîne. Lors du débogage, vérifiez la longueur des chaînes que vous alimentez les noms parambynames. Vérifiez également le type de champs numériques et assurez-vous de ne pas dépasser une valeur maximale. (J'ai eu ce problème une fois avec une chaîne dont la longueur dépasse la longueur varchars dans la table, et a eu ce problème avec un champ de base de données smallint que j'ai essayé de définir à une valeur trop élevée)

0

Comme d'autres l'ont dit, c'est presque certainement que vous poussez une chaîne trop grande dans l'un de vos champs. Cela peut également se produire avec des valeurs numériques, mais il s'agit le plus souvent d'une chaîne.

Je vous suggère de modifier temporairement chacun de votre ParamByName (''). AsString: = lignes blah avec une constante de texte, par exemple;

 
ParamByName('surname').AsString:='Smith'; 
ParamByName('firstname').AsString:='John'; 

etc, et voir si vous obtenez une erreur. Si cela se passe sans erreur, votre problème est probablement lié au fait que l'un de vos paramètres de chaîne est trop long. Vérifiez votre schéma de table et déboguez les chaînes que vous mettez dans les paramètres. En fonction de l'accès (et de l'expérience) dont vous disposez, il peut s'avérer plus utile d'activer la journalisation SQL Server de sorte que vous puissiez voir vos requêtes (et le contenu de ces paramètres) lorsqu'elles sont traitées par le serveur SQL. Cela vous montrera exactement quelles valeurs numériques et chaînes sont réellement données au serveur. Quelle version/édition de SQL Server utilisez-vous?

Questions connexes