Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Parameter unter Firedac (https://www.delphipraxis.net/188447-parameter-unter-firedac.html)

himitsu 5. Mär 2016 08:17

AW: Parameter unter Firedac
 
Der Index geht zwar schneller, aber wenn du z.B. mal am SQL was veränderst, dann ändert sich auch der Index, aber über den Namen gibt es niemals Probleme und im Code siehst auch schneller wo auf was zugegriffen wird.

Man nimmt ja auch meistens FieldByName und nicht Fields, wenn man auf die Felder zugreift.

Fallen gelassen wird nichts.
Der Parser geht von vorne nach hinden durch den String und die Parameter werden in der Reihenfolge in die Liste eingetragen, wie sie gefunden werden.
Kommt ein Parameter mehrmals im String vor, dann steht natürlich nur der "erste" Fund an seiner Stelle in der Liste und die nachfolgenden Funde werden nicht nochmal angehängt, da der Parameter dann ja schon existiert. :zwinker:

SQL-Code:
SELECT :a, :b, :a, :c
Delphi-Quellcode:
Params[0] = ParamByName('a')
Params[1] = ParamByName('b')
Params[2] = ParamByName('c')
SQL-Code:
SELECT :c, :b, :a, :a
Delphi-Quellcode:
Params[2] = ParamByName('a')
Params[1] = ParamByName('b')
Params[0] = ParamByName('c')

Delbor 5. Mär 2016 10:42

AW: Parameter unter Firedac
 
Liste der Anhänge anzeigen (Anzahl: 4)
Hi zusammen
Zitat von Sir Rufo:
Zitat:

Die Parameter werden erzeugt in FireDAC.Phys.SQLPreprocessor.TFDPhysPreprocessor.E xecute
Zumindest wer mit Delphi XE8 arbeite, wird da nichts finden - es ist wohl nicht das erste Mal, dass sich in Firedac einniges ändert.
Ich häng hier einige jpegs an, die hoffentlich meine Suche etwas dokumentieren können.

Gruss
Delbor

PS: Da muss ich wohl ziemlich geschlafen haben:
Zitat:

C:\Program Files (x86)\Embarcadero\Studio\16.0\source\data\firedac\ stan\param nichts gefunden habe...

Sir Rufo 5. Mär 2016 11:42

AW: Parameter unter Firedac
 
Diese Klasse/Unit ist auch in Seattle nicht dokumentiert.

Nimm doch einfach den Debugger und stepp durch den Code. Wenn dir das zu langweilig ist, dann suche die Parameter-Klasse und setze einen Breakpoint im
Delphi-Quellcode:
Create
. Wenn dann dort angehalten wird, gehst du einfach durch den Callstack durch und findest die Stellen, die das aufrufen.

So mache ich das wenigtens und das führt eigentlich immer zum Erfolg.

Delbor 7. Mär 2016 13:59

AW: Parameter unter Firedac
 
Hi zusammen
Zitat:

---------------------------
Im Projekt ContentMasterDXE8.exe ist eine Exception der Klasse EFDException mit der Meldung '[FireDAC][Phys][MySQL]-335. Datentyp des Parameters [LFOLDERID] ist unbekannt. Hinweis: Geben Sie TFDParam.DataType an, oder weisen Sie den TFDParam-Wert vor dem "Prepare"/"Execute"-Aufruf zu' aufgetreten.
---------------------------
Das ist die Fehlermeldung, die ich gerade eben erhalten habe. Und so versuche ich, das Ergebnis aus GuidToString in die DB zu bekommen:
Delphi-Quellcode:
function TFDMySQLDml.BildInsertQuery(LThumbMemory: TMemoryStream; LFolderID: TMemoryStream): integer;
  var SQLString: string; AUser,APass :string;
begin
  SQLString := 'Insert Into Bildtabelle(Thumbnail, FolderID) Values (:LThumbMemory, :LFolderID)';
  FDQueryMain.SQL.Text := SQLString;
  FDQueryMain.Params[0].LoadFromStream(LThumbMemory, ftgraphic);
  FDQueryMain.Params[0].LoadFromStream(LFolderId, ftstring); //<==
  FDQueryMain.ExecSQL(false);
...
Ursprünglich hatte ich den Datentyp für das Feld mit ftguid angegeben, aber da meckerte Delphi einige seltsame (unbekannte) Zeichen an.
Erzeugt wird die Guid so:
Delphi-Quellcode:
    ....
    if not FileExists(LPath+'IdentFile.cgf') then
    begin   // ist in dem Ordner kein IdentifikationsFile
      FolderID := CreateIDFile(LPath);
      Self.FIDFile := FolderID;                                                  /// wird eines angelegt
    end;

function TOpenFileFrame.CreateIDFile(LPath : String): String;
  var IdFile : TFileStream; ID_GUID: TGUID;
      UniqueName: String; Len: Longint;
begin
  if CreateGUID(ID_GUID) <> 0 then
     Result := 'Creating GUID failed!'
  else
  begin
     UniqueName := GUIDToString(ID_GUID);
     IdFile := TFileStream.Create(LPath,fmCreate);
     try
       Len := Length(UniqueName);
       IdFile.Write(Len, SizeOf(Len));
       IdFile.Write(PChar(UniqueName)^, Len);
     finally
      IdFile.Free;
     end;
     Result := 'IdentFile.cgf';
  end;
end;
Was mache ich falsch?

Gruss
Delbor

himitsu 7. Mär 2016 14:05

AW: Parameter unter Firedac
 
LFolderId = IdentFile.cgf ?
Binärdaten in einen String laden?

Delphi-Quellcode:
Params[0]
Params[0]
:roll:

Delphi-Quellcode:
FDQueryMain.Params[1].AsAString := TFile.ReadAllText(LFolderId); // natürlich nur, wenn da wirklich nur "Text" in der Datei ist

Delbor 9. Mär 2016 16:40

AW: Parameter unter Firedac
 
Hi Himitsu

Danke für den Tip! Entsprechend habe ich das wie folgt abgeändert
Delphi-Quellcode:
function TFDMySQLDml.BildInsertQuery(LThumbMemory: TMemoryStream; FolderId: string): integer;
  var SQLString: string; AUser,APass :string;
begin
  SQLString := 'Insert Into Bildtabelle(Thumbnail, FolderID) Values (:LThumbMemory, :FolderID)';
  FDQueryMain.SQL.Text := SQLString;
  FDQueryMain.Params[0].AsStream := LThumbMemory;
  FDQueryMain.Params[1].AsString := FolderID;
  FDQueryMain.ExecSQL(false);
....
und
Delphi-Quellcode:
function TOpenFileFrame.CreateIDFile(LPath : String): String;
  var IdFile : TFileStream; ID_GUID: TGUID;
      UniqueName: String; Len: Longint;
begin
  if CreateGUID(ID_GUID) <> 0 then
     Result := 'Creating GUID failed!'
  else
  begin
     UniqueName := GUIDToString(ID_GUID);
     IdFile := TFileStream.Create(LPath,fmCreate);
     try
       Len := Length(UniqueName);
       IdFile.Write(Len, SizeOf(Len));
       IdFile.Write(PChar(UniqueName)^, Len);
     finally
      IdFile.Free;
     end;
     Result := UniqueName;
  end;
end;
Meine letzte Fehlermeldung:
Zitat:

Benachrichtigung über Debugger-Exception
---------------------------
Im Projekt ContentMasterDXE8.exe ist eine Exception der Klasse EMySQLNativeException mit der Meldung '[FireDAC][Phys][MySQL] Data too long for column 'FolderID' at row 1' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
Das Feld in der DB ist jetzt ein Varchar(80). Max_allowed_packet (Maximale Packetgrösse) hat jetzt den Wert 16M. Beide Werte sollten nicht zu klein sein, um den Guidstring zu speichern.

Gruss
Delbor

himitsu 9. Mär 2016 17:51

AW: Parameter unter Firedac
 
hmmmmmmmmm :gruebel:

Etwas in dieser Richtung geht auch nicht?
Delphi-Quellcode:
FDQueryMain.SQL.Text := 'SELECT Thumbnail, FolderID FROM Bildtabelle WHERE 0'; // LIMIT 0
FDQueryMain.Open;
FDQueryMain.Insert;
FDQueryMain.FieldByName('Thumbnail').AsStream := LThumbMemory;
FDQueryMain.FieldByName('FolderID').AsString := FolderID;
FDQueryMain.Post;

Delbor 9. Mär 2016 20:42

AW: Parameter unter Firedac
 
Hi Himitsu

Ich bin überzeugt, dass es mit der SQL-Syntax nichts zu tun hat. Es hat ja nicht nur unter DBExpress, sondern auch unter FireDac funktioniert, bis ich der Tabelle das zusätzliche Feld verpasst habe.
Beim letzten Versuch habe ich mal ein Showmessage eingebaut. Das Resultat:
[Window Title]
Zitat:

Contentmasterdxe8

[Content]
Size of FolderId := 4

[OK]
Hmm... Variablen sind ja eigentlich Zeiger, und die sind 4 Bytes gross...

Gruss
Delbor

himitsu 10. Mär 2016 10:04

AW: Parameter unter Firedac
 
Wenn da 4 bei raus kommt, dann ist irgendwas "kaputt".

TField.Size = bei VARCHAR(MaxLength) sollte MaxLength raus kommen
TField.DataSize = bei VARCHAR(MaxLength) als WideStringField sollte 2+MaxLength*2 raus kommen

Sir Rufo 10. Mär 2016 10:24

AW: Parameter unter Firedac
 
Zitat:

Zitat von Delbor (Beitrag 1332471)
Delphi-Quellcode:
function TOpenFileFrame.CreateIDFile(LPath : String): String;
  var IdFile : TFileStream; ID_GUID: TGUID;
      UniqueName: String; Len: Longint;
begin
  if CreateGUID(ID_GUID) <> 0 then
     Result := 'Creating GUID failed!'
  else
  begin
     UniqueName := GUIDToString(ID_GUID);
     IdFile := TFileStream.Create(LPath,fmCreate);
     try
       Len := Length(UniqueName);
       IdFile.Write(Len, SizeOf(Len));
       IdFile.Write(PChar(UniqueName)^, Len);
     finally
      IdFile.Free;
     end;
     Result := UniqueName;
  end;
end;

Könntest du mal erklären wozu du das benötigst?

Du schreibst da einen GUID-String in eine Datei ... aber wozu? Um diesen String als Stream zu haben?

Nicht wirklich, oder etwa doch? :gruebel:


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:44 Uhr.
Seite 2 von 4     12 34      

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