2012-03-24 6 views
-1

hallo ive bekam eine SQL mit dem folgenden Code,fehlender Operator oder Semikolon Fehlermeldung

SELECT SUM (Travel_Cost)
VON Reisen
WHERE Job_ID =: MCODE

, um Erlaube dem Benutzer einen Wert von einer Edit-Komponente einzugeben, die an die SQL übergeben wird. Ich habe auch den folgenden Code,

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

Ich halte die Fehlermeldung

"fehlender Operator oder Semikolon"

wenn ich zu kompilieren versuchen, irgendwelche Vorschläge zu bekommen?

+0

Gibt es eine bestimmte Zeile, wo Sie das bekommen? Dieser Code sieht gut aus, aber vielleicht hast du noch mehr. Der Compiler sollte Ihnen die genaue Zeile mitteilen. – GolezTrol

+3

Die Eigenschaft 'Parameters' ist vom Typ' TParameters' und nicht 'indiziert'. Daher können Sie eine Zeichenfolge nicht als 'Index' oder 'Parameter' übergeben. Ich habe nie mit Datenbanksteuerelementen gearbeitet, also habe ich keine Ahnung, worum es eigentlich geht, aber vom Standpunkt der Syntax aus gesehen zum Beispiel: ADOQuery1.Parameters.ParamValues ​​['mcode']: = 'Test'; 'and' ADOQuery1.Parameters.ParamByName ('mcode'). Value: = 'text'; 'kompiliert. –

+0

Cont mit was Andreas gepostet, versuchen Sie ParamByName anstelle von Parameter. Stellen Sie außerdem sicher, dass der Parametereingabetyp "Mcode" dem Feldtyp Job_ID entspricht. Wenn beide Ganzzahlen sind, legen Sie den Parametereingabetyp auf "Integer" fest und konvertieren Sie den Wert "edit1.text" während der Zuweisung in Integer. –

Antwort

1

Während die Klasse eine Standardeigenschaft hat, akzeptiert sie eine Integer, keine string.

Wenn Sie den Index des Parameters kennen, können Sie verwenden:

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

Andernfalls müssen Sie verwenden:

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

Hinweis: Sie wollen mit einer der *ByName Funktionen vermeiden (ParamByName, FieldByName, usw.) in einer engen Schleife, wenn Sie können, denn jeder Aufruf führt eine lineare Suche auf der zugrunde liegenden Sammlung, bis es eine Übereinstimmung findet. In diesem speziellen Fall nicht wirklich relevant, aber in Betracht zu ziehen.