Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi PDF in Datenbank speichern (https://www.delphipraxis.net/176199-pdf-datenbank-speichern.html)

DeddyH 20. Aug 2013 10:25

AW: PDF in Datenbank speichern
 
Ich versteh den Sinn der ganzen Funktion nicht so richtig, wieso holst Du ein PDF aus einem BLOB-Feld, speicherst dies in eine Datei und löschst diese im Anschluss ggf. gleich wieder? Vom kreativen Gebrauch von Ressourcenschutzblöcken und Boolean-Vergleichen mal ganz abgesehen. Und wenn man einen BLOBStream mit bmRead zum Lesen erzeugt, wie muss es dann wohl zum Schreiben aussehen?

HolgerCW 20. Aug 2013 10:52

AW: PDF in Datenbank speichern
 
Ich verstehe selber zur Zeit gar nichts mehr.

Es geht mir darum, dass mir vielleicht eine andere Möglichkeit aufgezeigt wird eine PDF-Datei in eine Tabelle mit einer LONGRAW-Spalte zu schreiben, als wie ich Sie benutze, da komischerweise an bestimmten PC's (Ich nenne Sie mal CN-PCs) bei uns im Hause zwar mit meiner Eingangs geposteten Funktion ein Stream gespeichert wird, dieser aber nicht mehr ausgelesen werden kann ?

Soll heissen:

Folgende Auslesefunktion funktioniert bei allen PC's:

Delphi-Quellcode:
function Datensatz_auslesen_Picture_PDF(Tabelle, Spalte, Filter_Spalte, Filter_Wert, Pfad:String):Boolean;
var
 fs: TFileStream;
 blob: TStream;
begin

 Result := FALSE;

 DM_Main.TableRaw.Close;
 DM_Main.TableRaw.TableName := Tabelle;
 DM_Main.TableRaw.IndexFieldNames := Filter_Spalte;
 DM_Main.TableRaw.Filter := Filter_Spalte + ' = ' + Filter_Wert + '';
 DM_Main.TableRaw.Filtered := TRUE;
 DM_Main.TableRaw.Open;

 if DM_Main.TableRaw[Spalte] = '' then exit;

 blob := DM_Main.TableRaw.CreateBlobStream(DM_Main.TableRaw.FieldByName(Spalte), bmRead);
 blob.Seek(0, soFromBeginning);

 fs:=TFileStream.Create(Pfad, fmCreate);
 fs.CopyFrom(blob, blob.Size);

 fs.Free;
 blob.Free;

 Result := TRUE;

end;
Folgende Funktion speichert den Stream in der Datenbank. Nur wenn der Stream über die CN-PCs gespeichert wird kann man diesen Stream mit der obigen Funktion nicht mehr laden.

Delphi-Quellcode:
procedure Datensatz_speichern_Pictures_PDF(Tabelle, Spalte, Filter_Spalte, Filter_Wert, Pfad:String; PDF_loeschen: Boolean);
var
 ms, outstream: TMemoryStream;
begin

 ms := TMemoryStream.Create;
 outstream := TMemoryStream.Create;
 outstream.LoadFromFile(Pfad);
 outstream.Seek(0, soFromBeginning);

 DM_Main.QueryRaw.Close;
 DM_Main.QueryRaw.SQL[1] := Tabelle;
 DM_Main.QueryRaw.SQL[3] := Spalte;
 DM_Main.QueryRaw.SQL[5] := 'WHERE ' + Filter_Spalte;
 DM_Main.QueryRaw.ParamByName('p_pdf').SetBlobData(outstream.Memory, outstream.Size);
 DM_Main.QueryRaw.ParamByName('p_auftragsnummer').asstring := Filter_Wert;
 DM_Main.QueryRaw.ExecSQL;

 ms.Free;
 outstream.Free;

 if PDF_loeschen = true then
 begin

  DeleteFile(Pfad);

 end;

end;
Es geht mir darum eine andere Möglichkeit des speicherns von PDF-Dateien in eine Datenbank aufgezeigt zu bekommen, oder eventuell mal Hinweise was ich an der "Speicher-Funktion" mal testweise verändern sollte um dem Fehler auf den Grund zu gehen ?

Gruss

Holger

DeddyH 20. Aug 2013 11:00

AW: PDF in Datenbank speichern
 
Ich fand die Herangehensweise von Perlsau gar nicht schlecht, Feld und Dateinamen als einzige Parameter an eine Methode zu übergeben.

HolgerCW 20. Aug 2013 11:24

AW: PDF in Datenbank speichern
 
Nur fehlte da das speichern ? Wie mache ich das denn dann ?

p80286 20. Aug 2013 11:33

AW: PDF in Datenbank speichern
 
Zitat:

Zitat von HolgerCW (Beitrag 1225476)
Folgende Funktion speichert den Stream in der Datenbank. Nur wenn der Stream über die CN-PCs gespeichert wird kann man diesen Stream mit der obigen Funktion nicht mehr laden.

Und Du bist dir sicher, daß da etwas gespeichert wurde?
Ich finde Deine Methode der SQL-Text-Erzeugung ein wenig obskur.

Zitat:

Zitat von HolgerCW (Beitrag 1225476)
Es geht mir darum eine andere Möglichkeit des speicherns von PDF-Dateien in eine Datenbank aufgezeigt zu bekommen, oder eventuell mal Hinweise was ich an der "Speicher-Funktion" mal testweise verändern sollte um dem Fehler auf den Grund zu gehen ?

Ggf. solltest Du einmal die installierten Treiber Überprüfen, da hat es schon sehr seltsames Verhalten gegeben.

Gruß
K-H

DeddyH 20. Aug 2013 12:12

AW: PDF in Datenbank speichern
 
Wieso fehlt das Speichern? Wir reden doch beide von #3, oder?

p80286 20. Aug 2013 12:30

AW: PDF in Datenbank speichern
 
Nee nicht das Speichern, sondern die gespeicherten Daten!
(Soll alles schon vorgekommen sein.)

Gruß
K-H

Perlsau 20. Aug 2013 12:44

AW: PDF in Datenbank speichern
 
Zitat:

Zitat von p80286 (Beitrag 1225498)
Nee nicht das Speichern, sondern die gespeicherten Daten!
(Soll alles schon vorgekommen sein.)

Also ich kann alle meine gespeicherten PDF- und HTML-Dateien anzeigen. Hab das eben mal stichprobenartig ausprobiert und keinerlei fehlende Daten festgestellt: Alle HTML- und PDF-Dateien werden von der Datenbank direkt in den integrierten Browser geladen und angezeigt.

HolgerCW 20. Aug 2013 12:49

AW: PDF in Datenbank speichern
 
Perlsau schrieb in #3 aber

Zitat:

und auch das Post erfolgt nicht in der Funktion. Die erledigt nur das reine Einlesen einer Datei in ein Blobfeld.
Wie wird also anschliessend der Stream der PDF in der Datenbank gespeichert ?

Gruss

Holger

Perlsau 20. Aug 2013 13:20

AW: PDF in Datenbank speichern
 
Zitat:

Zitat von HolgerCW (Beitrag 1225503)
Wie wird also anschliessend der Stream der PDF in der Datenbank gespeichert ?

Das reine Abspeichern der PDF-Datei im Blobfeld erledigt die genannte Funktion. In der aufrufenden Methode können aber noch weitere Zuweisungen von Daten an Tabellenfelder stattfinden, in diesem Fall nur ein Boolean-Feld:
Delphi-Quellcode:
    DatMod.Qset_NewsLink.Edit;
    DatMod.Qset_NewsLink.FieldByName('EXISTIERT').AsBoolean := Existiert;
    IF FileExists(Dateiname) THEN
    BEGIN
       DatMod.DateiToBlob(Dateiname,DatMod.Qset_NewsLink,DatMod.Qset_NewsLink.FieldByName('INHALT'));
       DeleteFile(Dateiname);
    END;
    DatMod.Qset_NewsLink.Post;
Das funktioniert so sicher & zuverlässig, daß ich die Quelldatei (ob nun PDF oder HTML) danach einfach löschen kann.


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