Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Problem mit FireDac Parameter.Size (https://www.delphipraxis.net/207665-problem-mit-firedac-parameter-size.html)

rokli 21. Apr 2021 09:15

Datenbank: MS SQL • Version: 2016 • Zugriff über: FireDax

Problem mit FireDac Parameter.Size
 
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?

rokli 21. Apr 2021 12:14

AW: Problem mit FireDac Parameter.Size
 
Liste der Anhänge anzeigen (Anzahl: 1)
So, der Umbau auf:

Delphi-Quellcode:
      with dm1.qryProto.Params[0] do begin
         Name         := 'sText';
         ParamType   := ptInput;
         DataType      := ftString;
         Size         := iTxt;
         Value         := sProtoTxt;
      end;
      with dm1.qryProto.Params[1] do begin
         Name         := 'sSql';
         ParamType   := ptInput;
         DataType      := ftString;
         Size         := iSql;
         Value         := sProtoSql;
      end;
hat auch nichts gebracht.

Aber: Wenn ich im OI an den Parametern das Feld "Datengröße" fülle, dann funktioniert das sehr wohl.

DeddyH 21. Apr 2021 13:21

AW: Problem mit FireDac Parameter.Size
 
Das Phänomen hatte ich früher auch schon einmal. Was geschieht, wenn Du vorher testhalber die Size auf 0 setzt?


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz