Einzelnen Beitrag anzeigen

rokli

Registriert seit: 21. Mär 2009
Ort: Rödinghausen
301 Beiträge
 
Delphi 10.4 Sydney
 
#1

Problem mit FireDac Parameter.Size

  Alt 21. Apr 2021, 09:15
Datenbank: MS SQL • Version: 2016 • Zugriff über: FireDax
Moin,

ich will einen Datensatz INSERTen oder UPDATEn. Dazu bekommt die Delphi Procedure die Felder Protokolltext (sProtoText), SQL-Statement (sProtoSQL), aus welcher Form das kommt (sForm) und ob die Ursache ein Fehler war oder "nur" ein Protokolleintrag ist (iError).

Wenn ein (String-)Parameter die Standardlänge überschreitet, muss die Länge des Parameters vorher gesetzt werden, so dass FireDac das verarbeiten kann. Die folgende Procedure soll ein Insert in die Protokoll DB ausführen:

Delphi-Quellcode:
procedure TfrmMain.p_Proto(sProtoTxt, sProtoSQL, sForm : String; iError : Byte);
{-----------------------------------------------------------------------------------------------------------------------
   Protokoll schreiben
-----------------------------------------------------------------------------------------------------------------------}

var
   iTxt      : Integer;
   iSql      : Integer;
   bError   : Boolean;
begin
   iTxt      := 0;
   iSql      := 0;

   iTxt      := LENGTH(sProtoTxt);
   iSql      := LENGTH(sProtoSql);


      ShowMessage('Textlänge ' + IntToStr(iTxt) + #13 +
                  'SQL-Länge ' + IntToStr(iSql));


      dm1.qryProto.ParamByName('sText').Size       := iTxt;
      dm1.qryProto.ParamByName('sText').AsString    := sProtoTxt;
      dm1.qryProto.ParamByName('sSql').Size       := iSql;
      dm1.qryProto.ParamByName('sSql').AsString   := sProtoSql;
      dm1.qryProto.ParamByName('sForm').AsString   := sForm;
      dm1.qryProto.ParamByName('sVersion').AsString   := sDelphiVer + ' ' + sVersion + ' ' + sVerDat;
      dm1.qryProto.ParamByName('bErrKz').AsBoolean   := bError;
      dm1.qryProto.ExecSQL;

end;
Da der Protokolltext (sProtoText) und das SQL-Statement (sProtoSQL) häufig zu lang als Parameter sind, stelle ich die aktuelle Länge der beiden Felder fest und übergebe diese in die Size. Der SchowMessage ist nur dazu da, das ist die ermittelte Längenwerte kontrollieren kann. Trotzdem kommt die Fehlermeldung

---------------------------
Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt ProdImp.exe ist eine Exception der Klasse EFDException mit der Meldung '[FireDAC][Phys][ODBC]-345. Daten zu groß für Variable [STEXT]. Maximale Länge = [24], tatsächliche Länge = [272] Hinweis: Setzen Sie TFDParam.Size auf einen größeren Wert' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------

Ich verstehe es nicht, da ich sicher bin, dass ich das schon mal so gemacht habe.

Was mache ich falsch, wenn ich in sText = 272 und in sSQL = 475 Zeichen lange Text übergeben will?
Rolf
wenn nicht anders angegeben, schreibe ich zu D7, XE2 und MS SQL - ansonsten fragen Sie ihren Administrator oder einen Operator. Update 06/2020: Delphi 10.4 Sydney
  Mit Zitat antworten Zitat