Einzelnen Beitrag anzeigen

Thaleilama

Registriert seit: 6. Apr 2019
3 Beiträge
 
#1

ADO Query Parameter zur Laufzeit erstellen

  Alt 6. Apr 2019, 13:21
Datenbank: MySQL • Version: 10.1.37 • Zugriff über: ODBC
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?

Geändert von Thaleilama ( 6. Apr 2019 um 19:59 Uhr)
  Mit Zitat antworten Zitat