Hallo zusammen!
Ich bin gerade etwas am Verzweifeln bei dem Versuch Parameter für eine ADOQuery zur Laufzeit zu erstellen.
Ich nutzte Delphi 10.2.
Das ERP-System sowie die App sind über
ODBC angelegt.
Die Beispiele sind etwas gekürzt und auf die wesentlichen Funktionen beschränkt.
Ich habe mir eine Datenbank
Unit erstellt und ein TDatabse Klasser erstellt, die von der TADOConnection erbt.
Das gleiche mit einer TQuery Klasse, die von der TADOQuery erbt.
Code:
TDatabase = class(TADOConnection)
constructor Create; reintroduce;
private
public
function TryEstablishingConnection: Boolean;
procedure SetConnectionToERP;
procedure SetConnectionToApp;
end;
TQuery = class(TADOQuery)
constructor Create; reintroduce;
private
public
end;
Die Konstruktoren sind wie folgt
Code:
constructor TDatabase.Create;
begin
inherited Create(nil);
Self.LoginPrompt := False;
Self.Mode := cmReadWrite;
end;
constructor TQuery.Create;
begin
inherited Create(nil);
Self.EnableBCD := False;
end;
Dann gibt es noch eine
Unit für Einstellungen, die die Einstellungen in der
MySQL-Datenbank setzten soll.
Die Funktion dafür lautet wie folgt
Code:
class procedure TEinstellung.SetzeTransferZeitpunkt(Nummer: Integer);
var
appCon: TDatabase;
appUpdate: TQuery;
begin
appCon := TDatabase.Create;
appCon.SetConnectionToApp;
if appCon.TryEstablishingConnection then
begin
appUpdate := TQuery.Create;
appUpdate.Connection := appCon;
appUpdate.SQL.Text := 'UPDATE appeinstellungen SET zeit = CURRENT_TIMESTAMP WHERE nummer = :appNummer';
appUpdate.Parameters.ParamByName('appNummer').Value := Nummer;
try
appUpdate.ExecSQL;
except
on E:
Exception do
begin
appUpdate.Close;
end;
end;
appUpdate.Close;
FreeAndNiL(appUpdate);
end;
appCon.CloseConnection;
FreeAndNil(appCon);
end;
Debugge ich diese Anwendung koommt an der appUpdate.SQL.Text Zeile folgende Fehlermeldung
Die Argumente sind vom falschen Typ, liegen außerhalb des Gültigkeitsbereiches oder sind miteinander unvereinbar
Daraufhin habe ich die TQuery Klasse erweitert und den Aufruf bei den Einstellungen angepasst
Code:
TQuery = class(TADOQuery)
constructor Create; reintroduce;
private
public
procedure AddIntegerParam(FieldName: String);
end;
procedure TQuery.AddIntegerParam(FieldName: string);
begin
Parameters.AddParameter.Name := FieldName;
Parameters.ParamByName(FieldName).DataType := ftInteger;
end;
[Einstellungen]
[...]
appUpdate.AddIntegerParam('appNummer');
appUpdate.SQL.Text := 'UPDATE appeinstellungen SET zeit = CURRENT_TIMESTAMP WHERE nummer = :appNummer';
appUpdate.Parameters.ParamByName('appNummer').Value := Nummer;
[...]
Der Fehler blieb jedoch bestehen. Ich habe auch versucht
appUpdate.Prepared := True; bzw.
appUpdate.Prepared := False; vor dem setzten des
SQL.Textes auszuführen.
Ohne eine Änderung.
Nach einigem Suchen fand ich dann eine Funktion um Parameter mittels CreateParameter zu erzeugen und habe das in die AddIntegerParam Prozedur eingebaut.
Code:
procedure TQuery.AddIntegerParam(FieldName: string; Value: Integer);
begin
Parameters.CreateParameter(FieldName, ftInteger, pdInputOutput, -1, Value);
end;
Der Fehler bliebt jedoch weiterhin bestehen. Nach weiterem Suchen fand ich dann heraus, dass es manchmal Probleme geben kann und ich den Parameter in der
Query in "" setzen soll.
Dies habe ich entsprechend umgebaut zu
Code:
appUpdate.AddIntegerParam('appNummer');
appUpdate.SQL.Text := 'UPDATE appeinstellungen SET zeit = CURRENT_TIMESTAMP WHERE nummer = ":appNummer"';
appUpdate.Parameters.ParamByName('appNummer').Value := Nummer;
Dann sprang der Debugger weiter bis zur Zeile nach dem setzen des
SQL.Text.
Hier erscheint nun die Fehlermeldung:
Parameter appNummer nicht gefunden.
Daher habe ich den Block erweitert, damit der
SQL.Text nochmal geparst wird
Code:
appUpdate.AddIntegerParam('appNummer');
appUpdate.SQL.Text := 'UPDATE appeinstellungen SET zeit = CURRENT_TIMESTAMP WHERE nummer = ":appNummer"';
appUpdate.Parameters.ParseSQL(appUpdate.SQL.Text, True);
appUpdate.Parameters.ParamByName('appNummer').Value := Nummer;
Dies brachte allerdings auch keinen Erfolg, der Parameter kann noch immer nicht gefunden werden.
Hat noch jemand eine Idee was ich hier Probieren könnte?