2012-03-24 2 views
-1

Salut Ive a obtenu un SQL avec le code suivant,manquant message d'opérateur ou d'une erreur de virgule

SELECT SUM (Travel_Cost)
DE Voyage
OÙ JOB_ID =: MCODE

pour permettre à l'utilisateur d'entrer une valeur à partir d'un composant d'édition qui est passé au SQL j'ai le code suivant ainsi,

procedure TfrmExpenses.Button3Click(Sender: TObject);  
begin   
    ADOQuery1.active:=false;  
    ADOQuery1.Parameters('mcode').AsString:=Edit1.Text;  
    ADOQuery1.active:=true;  
end; 

Je continue à faire passer le message d'erreur

"manquant opérateur ou virgule"

quand je tente de compiler, des suggestions?

+0

Y a-t-il une ligne spécifique où vous obtenez cela? Ce code a l'air correct, mais peut-être en avez-vous plus. Le compilateur devrait vous dire la ligne exacte. – GolezTrol

+3

La propriété 'Parameters' est de type' TParameters' et non 'indexée'. Par conséquent, vous ne pouvez pas "passer" une chaîne comme un "index" ou "paramètre". Je n'ai jamais travaillé avec des contrôles de base de données, donc je n'ai aucune idée de quoi il s'agit, mais d'un point de vue syntaxique, par exemple, 'ADOQuery1.Parameters.ParamValues ​​['mcode']: = 'Test';' et ' ADOQuery1.Parameters.ParamByName ('mcode'). Value: = 'text'; 'compile. –

+0

Suite à ce que Andreas a posté, essayez d'utiliser ParamByName au lieu de Parameters. Assurez-vous également que le type d'entrée de paramètre 'mcode' correspond au type de champ Job_ID. Si les deux sont des entiers, définissez le type d'entrée de paramètre sur integer et convertissez le fichier edit1.text en entier pendant votre affectation. –

Répondre

1

Alors que la classe TParameters a une propriété par défaut, elle accepte un Integer, pas un string.

Si vous connaissez l'index du paramètre, vous pouvez utiliser:

var I: Integer; 
.... 
ADOQuery1.Parameters[I].AsString := Edit1.Text; 

Sinon, vous devez utiliser:

ADOQuery1.Parameters.ParamByName('mcode').AsString := Edit1.Text; 

Remarque: vous voulez éviter d'utiliser l'une des fonctions *ByName (ParamByName, FieldByName, etc) dans une boucle serrée si vous le pouvez parce que chaque appel effectue une recherche linéaire sur la collection sous-jacente jusqu'à ce qu'il trouve une correspondance. Pas vraiment pertinent dans ce cas particulier, mais mérite d'être pris en considération.

Questions connexes