Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi PDF-Datei (BLOB) in eine MySql-Tabelle speichern und lesen (Delphi 2010) (https://www.delphipraxis.net/155370-pdf-datei-blob-eine-mysql-tabelle-speichern-und-lesen-delphi-2010-a.html)

Jürgen Paulus 20. Okt 2010 16:31

Datenbank: MySql • Version: 4.1.22 • Zugriff über: DBEXPRESS

PDF-Datei (BLOB) in eine MySql-Tabelle speichern und lesen (Delphi 2010)
 
Da bei mir der folgende Code

Delphi-Quellcode:
SQLDataSet1.CommandText := sql;
SQLDataSet1.Active     := true;
ClientDataSet1.Active  := true;
Blob := ClientDataSet1.FieldByName ('f03') AS TBlobField;
ClientDataSet1.Edit;
Blob.LoadFromStream (str_PDF);
ClientDataSet1.FieldByName ('f04').AsInteger := 100;
ClientDataSet1.Post;
ClientDataSet1.Active  := false;
SQLDataSet1.Active     := false;
nicht funktionierte, habe ich folgende Lösung gefunden:

Delphi-Quellcode:
sql := 'insert into t01_r03' +#32
      +'set f01=' +ID +',' +#32
          +'f03=:f03';

sql_t01r03.Params.ParamByName('f03').LoadFromStream(str_PDF, ftBlob);

if sql_t01r03.Sql.Count = 0 then
  sql_t01r03.SQL.Add (sql)
else
  sql_t01r03.Sql[0] := sql;

sql_t01r03.ExecSQL;
Zum wieder einlesen des Blob funktioniert folgender Code:
Delphi-Quellcode:
sql := 'select * from t01_r03' +#32
       +'where f01=' +ID;

sql_query.Sql.Clear;
sql_query.SQL.Add (sql);
sql_query.Open;

Stream := sql_query.CreateBlobStream (sql_query.FieldByName('f03'),bmRead);
MemoryStream.LoadFromStream (Stream);
MemoryStream.SaveToFile (ID+'.pdf');

sql_query.Close;

Bernhard Geyer 20. Okt 2010 17:21

AW: PDF-Datei (BLOB) in eine MySql-Tabelle speichern und lesen (Delphi 2010)
 
Und wo ist jetzt die Frage :gruebel:


In der nicht funktionierenden Lösung ist der Typ von str_PDF unklar und wie dieser gefüllt wird.

Jürgen Paulus 20. Okt 2010 17:46

AW: PDF-Datei (BLOB) in eine MySql-Tabelle speichern und lesen (Delphi 2010)
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1056760)
Und wo ist jetzt die Frage :gruebel:


In der nicht funktionierenden Lösung ist der Typ von str_PDF unklar und wie dieser gefüllt wird.

var
str_PDF : TMemoryStream;

Nicht wirklich eine Frage, habe schließlich eine Lösung gefunden, nachdem ich den ganzen Tag damit verbracht habe.
Aber ja, warum das mit dem ClientDataSet nicht funktioniert, würde mich schon interessieren.

Bernhard Geyer 20. Okt 2010 20:13

AW: PDF-Datei (BLOB) in eine MySql-Tabelle speichern und lesen (Delphi 2010)
 
Zitat:

Zitat von Jürgen Paulus (Beitrag 1056768)
Aber ja, warum das mit dem ClientDataSet nicht funktioniert, würde mich schon interessieren.

AFAIK kann das Clientdataset keine Daten in einer DB speichern.

Jürgen Paulus 21. Okt 2010 09:22

AW: PDF-Datei (BLOB) in eine MySql-Tabelle speichern und lesen (Delphi 2010)
 
Zitat:

AFAIK kann das Clientdataset keine Daten in einer DB speichern.
Wollte es gar nicht einfügen, nur ändern, aber das hat auch nicht funktioniert. Möglicherweise hatte ich noch "cds.ApplyUpdates(0)" http://www.tek-tips.com/faqs.cfm?fid=4722 aufrufen sollen.

Freiwilderer 3. Nov 2011 09:42

AW: PDF-Datei (BLOB) in eine MySql-Tabelle speichern und lesen (Delphi 2010)
 
hi,
ich weiß, dass der Beitrag schon etwas älter ist, aber vielleicht bringts ja doch was nochmal nachzufragen.
und zwar. Ich versuche auch gerade eine PDF Aus einem VarBinary(Max) zu lesen. Habe es genau so gemacht, wie unten beschrieben, aber wenn ich die PDF dann öffnen will, sagt der Foxit Reader: format error: not a PDF or corrupted

Delphi-Quellcode:

procedure TForm.ViewPDF;
var
   ts: TStream;
   ms: TMemoryStream;
begin
   ts := TStream.Create;
   ts := dm.qQuery.CreateBlobStream(dm.qQuery.Fieldbyname('Datei'),bmRead);
   ms := TMemoryStream.Create;
   ms.LoadFromStream(ts);
   ms.SaveToFile('C:\test3.pdf');
end
was mach ich hier falsch?

DeddyH 3. Nov 2011 09:50

AW: PDF-Datei (BLOB) in eine MySql-Tabelle speichern und lesen (Delphi 2010)
 
Du baust Dir Speicherlecks. Und IIRC musst Du zuerst "zurückspulen". Wie ist es so?
Delphi-Quellcode:
procedure TForm.ViewPDF;
var
   ts: TStream;
   ms: TMemoryStream;
begin
  ts := dm.qQuery.CreateBlobStream(dm.qQuery.Fieldbyname('Datei'),bmRead);
  try
    ms := TMemoryStream.Create;
    try
      ts.Position := 0;
      ms.LoadFromStream(ts);
      ms.SaveToFile('C:\test3.pdf');
    finally
      ms.Free;
    end;
  finally
    ts.Free;
  end;
end

Freiwilderer 3. Nov 2011 09:53

AW: PDF-Datei (BLOB) in eine MySql-Tabelle speichern und lesen (Delphi 2010)
 
hi,
danke für die schnelle Antwort, leider bewirkt das genau das selbe.

DeddyH 3. Nov 2011 09:56

AW: PDF-Datei (BLOB) in eine MySql-Tabelle speichern und lesen (Delphi 2010)
 
Wie groß ist denn die resultierende Datei? Vielleicht ist CopyFrom besser geeignet als LoadFromStream, aber das ist nur geraten.

Freiwilderer 3. Nov 2011 10:02

AW: PDF-Datei (BLOB) in eine MySql-Tabelle speichern und lesen (Delphi 2010)
 
naja, hätte vielleicht erwähnen können, dass sie zu klein ist ...

also ich hab diese PDF in einem VarBinary gespeichert. Es gibt eine Funktion, die auch funktioniert, die die Datei in die Zwischenablage kopiert. Da hat sie 298KB. wenn ich das über SaveToFile versuche kommen nur 3KB dabei raus.
Ich hab eben
Delphi-Quellcode:
ms.CopyFrom(ts,0);
probiert, leider ebenfalls nur 3KB

DeddyH 3. Nov 2011 10:06

AW: PDF-Datei (BLOB) in eine MySql-Tabelle speichern und lesen (Delphi 2010)
 
Das würde ja bedeuten, dass ts.Size ebenfalls nur 3 KB beträgt. Hast Du das mal überprüft? Wenn dem so sein sollte, klappt das Auslesen ja schon nicht richtig.

Freiwilderer 3. Nov 2011 10:08

AW: PDF-Datei (BLOB) in eine MySql-Tabelle speichern und lesen (Delphi 2010)
 
... ich habs jetzt mal überprüft :D
also ts.size beträgt 2565, genau so, wie ms.size

DeddyH 3. Nov 2011 10:15

AW: PDF-Datei (BLOB) in eine MySql-Tabelle speichern und lesen (Delphi 2010)
 
Dann liegt das Problem wohl beim Auslesen oder gar schon beim Speichern. Da kann ich leider im Moment nicht weiterhelfen.

Freiwilderer 3. Nov 2011 10:18

AW: PDF-Datei (BLOB) in eine MySql-Tabelle speichern und lesen (Delphi 2010)
 
also beim speichern kann ich mir eigentlich nicht vorstellen, da es, wie gesagt über die zwischenablage ja ähnlich klappt.
so richtig viel bleibt da aber auch nicht mehr übrig :(

trotzdem danke.
ich werds wohl erstmal mit nem anderen pdf versuchen und dann mal schauen, wie ich das machen kann ...


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:10 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