Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Qry:Params.Clear bringt Fehler (https://www.delphipraxis.net/203429-qry-params-clear-bringt-fehler.html)

juergen 15. Feb 2020 21:09

Datenbank: ODBC • Version: xxx • Zugriff über: FireDAC

Qry:Params.Clear bringt Fehler
 
Edit: 16.02.2020, Bitte das hier ignorieren und direkt ab Post #6 weiterlesen. Danke!

Hallo zusammnen,

ich setze in einer Schleife -je nach Bedingung- die Params einer Query.
Z.B. (nur auszugsweise ohne Fehlerbehandliung usw.):

Delphi-Quellcode:
WITH FDQry_Update.Params DO
BEGIN
  WITH Add DO
  BEGIN
    NAME := 'Bild';
    DataType := ftStream;
    ParamType := ptInput;
    StreamMode := smOpenWrite; { uses FireDAC.Stan.Intf }
  END;
END;

FDQry_Update.ParamByName( 'Bild' ).AsStream := Bild_codiert_als_Base64_aus_StringList_in_Stream_encodieren( Bild_zaehler ) { function };

FDQry_Update.Close;                          
FDQry_Update.ParamByName( 'Bild' ).Free;      
FDQry_Update.Params.Clear; { <=== ! hier knallt es }

Folgende Fehlermeldung erscheint:
Erste Gelegenheit für Exception bei $000000000040E315. Exception-Klasse $C0000005 mit Meldung 'c0000005 ACCESS_VIOLATION'. Prozess xxxx.exe (9564)

Ich habe nun schon einiges probiert mit .Free usw. und verstehe auch nicht warum bei Clear diese Fehlermedlung erscheint.
Nur bei dieser einen Bedingung -wo der Datentyp ftStream ist- knallt es. Die anderen funktionieren.

Kennt hier jemand das Problem, bzw. weiß Rat woran es liegen könnte?

Vielen Dank schon mal vorab!

juergen 15. Feb 2020 21:46

AW: Qry:Params.Clear bringt Fehler
 
Hallo Frühlingsrolle,

leider ist das nicht das Problem. Anfangs hatte ich das auch nicht, hatte halt einiges probiert.
Wenn ich die Zeile weglasse kommt derselbe Fehler. :(

juergen 15. Feb 2020 22:13

AW: Qry:Params.Clear bringt Fehler
 
Hallo Frühlingsrolle,
Stop!
Das Problem scheint beim Stream zu sein, ist nämlich leer. Da hatte mich der Debugger auf die falsche Spur gebracht.
Danke erst mal für deine Unterstützung!

juergen 16. Feb 2020 12:52

AW: Qry:Params.Clear bringt Fehler
 
Hallo zusammen,

ich kann machen was ich will, es kommt immer die selbe Schutzverletzung, wenn ich einen Parameter als ftStream definiert habe und dann entweder die Connection schließen will
Delphi-Quellcode:
uDataModul.DataModule1.FDConnection1.Connected := False
oder die Parameter löschen will
Delphi-Quellcode:
uDataModul.DataModule1.FDQry_Update.Params.Clear
oder den Stream frei geben will
Delphi-Quellcode:
uDataModul.DataModule1.FDQry_Update.CloseStreams
oder die Query schließen will
Delphi-Quellcode:
uDataModul.DataModule1.FDQry_Update.Close
.
Auch in allen möglichen Reihenfolgen/ Kombinationen probiert.

Delphi-Quellcode:
WITH uDataModul.DataModule1.FDQry_Update.Params DO
BEGIN
  Clear; { !  weil ich in einer Schleife zuvor auch schon Params anwende muss ich die hier löschen }
  WITH Add DO
  BEGIN
    NAME := 'Bild';
    DataType := ftStream;
    ParamType := ptInput;
    StreamMode := smOpenWrite; { uses FireDAC.Stan.Intf }
  END;
  WITH Add DO
  BEGIN
    NAME := 'RecID_GR';
    DataType := ftInteger;
    ParamType := ptInput;
  END;
END;
TRY
  uDataModul.DataModule1.FDQry_Update.ParamByName( 'Bild' ).AsStream := TStream( l_AStream );
  uDataModul.DataModule1.FDQry_Update.ParamByName( 'RecID_GR' ).AsInteger := gi_RecID_GR;

  uDataModul.DataModule1.FDQry_Update.ExecSQL;
FINALLY
  l_AStream.Free;
  // uDataModul.DataModule1.FDQry_Update.CloseStreams;
  // uDataModul.DataModule1.FDQry_Update.Close;
  // uDataModul.DataModule1.FDQry_Update.Params.Clear;
  // uDataModul.DataModule1.FDConnection1.Params.Free;
  // uDataModul.DataModule1.FDConnection1.Connected := False;    <===== bei den 5 Anweisungen knallt es immer (wenn aktiv) mit der selben Fehlermeldung, in allen möglichen Kombinationen
END;
Fehlermeldung:
Zitat:

Erste Gelegenheit für Exception bei $000000000040E315. Exception-Klasse $C0000005 mit Meldung 'c0000005 ACCESS_VIOLATION'

Hat jemand noch eine Idee wie man die uDataModul.DataModule1.FDQry_Update closen kann, *ohne* dass die Fehlermeldung ausgelöst wird?

Vielen Dank.

juergen 16. Feb 2020 20:47

AW: Qry:Params.Clear bringt Fehler
 
Hallo Frühlingsrolle,

das With entfernen hatte leider nichts geändert.
Ich habe nun aber herausgefunden, dass im Finally-Block nur noch

Delphi-Quellcode:
uDataModul.DataModule1.FDQry_Update.Close;
uDataModul.DataModule1.FDConnection1.Connected := False;
stehen darf! DANN FUNKTIONERT ES (es kommt KEINE Schutzverletzung mehr)!!!

Ich darf also meinen Stream l_AStream nicht freigeben...
Wird denn durch
Delphi-Quellcode:
FDQry_Update.Close
auch mein Stream l_AStream gefree'ed (l_AStream.Free) ????
Denn ich erhalte wider Erwarten kein Speicherleck beim Beenden des Programms (FastMM4 ist eingebunden und ReportMemoryLeaksOnShutdown steht auch auf True)
Das hatte ich so nicht erwartet.

Uwe Raabe 16. Feb 2020 21:22

AW: Qry:Params.Clear bringt Fehler
 
Mit der Zuweisung auf
Delphi-Quellcode:
TFDParam.AsStream
wird der
Delphi-Quellcode:
TFDParam
Eigentümer des Streams. Willst du das steuern, musst du
Delphi-Quellcode:
SetStream
verwenden.

juergen 17. Feb 2020 07:35

AW: Qry:Params.Clear bringt Fehler
 
Guten Morgen Uwe,

danke für aufklärenden Worte. Das bestätigt mein Verdacht im *Nachhinein*. Leider hatte ich diesen Umstand nicht in Betracht gezogen und in der Hilfe auch nichts dazu gefunden, so dass ich viel Zeit benötigt hatte um zu dieser Erkenntnis zu gelangen. Wieder was gelernt.

Uwe Raabe 17. Feb 2020 08:58

AW: Qry:Params.Clear bringt Fehler
 
Zitat:

Zitat von juergen (Beitrag 1457669)
und in der Hilfe auch nichts dazu gefunden

Dann hast du offenbar nicht gründlich genug gesucht. Daher hier für's nächste Mal:
Unterstützung für das Blob-Streaming in FireDAC:
Zitat:

Der Parametereigenschaft AsStream eine Stream-Referenz zuweisen. In diesem Fall wird FireDAC zum Eigentümer der Stream-Referenz. Das Objekt wird nach dem Aufheben der Vorbereitung der Abfrage oder nach der nächsten Wertzuweisung freigegeben. Alternativ können Anwendungen mit der Parametermethode SetStream die Eigentümerschaft steuern. Der Stream wird ab der aktuellen Stream-Position verwendet.
FireDAC.Stan.Param.TFDParam.AsStream:
Zitat:

Durch Festlegen der Eigenschaft AsStream wird die Eigenschaft DataType auf ftStream gesetzt, falls es sich nicht um die Zeichen-String-/Byte-String-/BLOB-Datentypen handelt. Der TFDParam wird Eigentümer des zugewiesenen TStream-Objekts. Mit der Methode SetStream können Sie die Eigentümerschaft explizit steuern.

juergen 17. Feb 2020 19:27

AW: Qry:Params.Clear bringt Fehler
 
Danke Uwe!
In meiner Offline Hilfe war ich wohl zu dämlich das zu finden. :oops:

Die Hilfe ist an der Stelle ja richtig Klasse.
Habe meinen Code jetzt auch so geändert wie in der Hilfe beschrieben.

Schönen Abend noch!

Uwe Raabe 17. Feb 2020 21:00

AW: Qry:Params.Clear bringt Fehler
 
Ich muss gestehen, daß im deutschen Text zu
Delphi-Quellcode:
TFDParam.AsStream
erst ein Übersetzungsfehler bereinigt werden musste, der für Verwirrung sorgen konnte. 8-)


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:38 Uhr.
Seite 1 von 2  1 2      

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