Delphi-PRAXiS
Seite 3 von 4     123 4      

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)

HolgerCW 20. Aug 2013 15:02

AW: PDF in Datenbank speichern
 
Alles klar.

Habe es jetzt mal für mich etwas umgebaut:

Delphi-Quellcode:
function Datensatz_speichern_PDF(Tabelle, Spalte, Filter_Spalte, Filter_Wert, Pfad:String; PDF_loeschen: Boolean):Boolean;
var
 S : TStream;
 FileS : TFileStream;
 BlobFeld: TField;
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;
 DM_Main.TableRaw.Edit;

 BlobFeld := DM_Main.TableRaw.FieldByName(Spalte);

 S := BlobFeld.DataSet.CreateBlobStream(BlobFeld, bmReadWrite);

 try

  FileS := TFileStream.Create(Pfad, fmOpenRead);
  S.CopyFrom(FileS, FileS.Size);
  DM_Main.TableRaw.Post;
  Result := TRUE;

 finally

  FileS.Free;
  S.Free;

 end;

end;
Nur leider werden keine Daten gespeichert. Wo ist der Fehler ?

Gruss

Holger

DeddyH 20. Aug 2013 15:05

AW: PDF in Datenbank speichern
 
"Zurückspulen" vergessen?

HolgerCW 20. Aug 2013 15:08

AW: PDF in Datenbank speichern
 
Wenn ich vor dem "try" folgenden Code eingebe:

Delphi-Quellcode:
S.Seek(0, soFromBeginning);
bringt das ncihts, wenn Du das meinst ?

Gruss

Holger

Perlsau 20. Aug 2013 15:10

AW: PDF in Datenbank speichern
 
Zitat:

Zitat von HolgerCW (Beitrag 1225512)
Nur leider werden keine Daten gespeichert. Wo ist der Fehler ?

Wie stellst du fest, daß keine Daten gespeichert werden? In welchen Datensatz speicherst du deine Daten und welchen Datensatz überprüfst du daraufhin, ob er die PDF-Datei auch enthält?

Wenn ich das richtig sehe, speicherst du alles immer in den ersten Record (Open setzt den Datensatzzeiger auf den ersten Record). Möchtest du einen neuen Datensatz anlegen, dann muß es natürlich Append oder Insert statt Edit heißen. Wenn du einen bestehenden Datensatz bearbeiten möchtest, solltest du zuvor den gewünschten Datensatz lokalisieren.

Perlsau 20. Aug 2013 15:14

AW: PDF in Datenbank speichern
 
Zitat:

Zitat von DeddyH (Beitrag 1225513)
"Zurückspulen" vergessen?

Soweit ich weiß, steht ein FileStream immer am Anfang nach dem Laden ...

HolgerCW 20. Aug 2013 15:19

AW: PDF in Datenbank speichern
 
Ich filtere ja die TTable vorher auf einen bestimmten Datensatz und wenn ich dann "open" machen müsste doch dieser Datensatz geöffnet werden, oder ?

Wenn ich jetzt aber .edit gegen .append austausche klappt es auch nciht.

Überprüfen tue ich das mit dem SQl-Developer, ob in der Spalte nun Daten vorhanden sind.

Was könnte an meinem Code ncoh falsch sein ?

Gruss

Holger

Perlsau 20. Aug 2013 15:31

AW: PDF in Datenbank speichern
 
Zitat:

Zitat von HolgerCW (Beitrag 1225520)
Ich filtere ja die TTable vorher auf einen bestimmten Datensatz und wenn ich dann "open" machen müsste doch dieser Datensatz geöffnet werden, oder?

Im Grunde schon, wenn Filtered auf True steht und wenn der Filter überhaupt einen Datensatz zurückliefert. Ich würde hier besser Locate einsetzen. Ansonsten kann ich nicht viel mehr drüber sagen, denn mir ist der Status deiner Anwendung zum Zeitpunkt des Aufrufs der Einlese-Funktion nicht bekannt. Wäre mir jetzt auch zu viel Arbeit, deinen ganzen Programmcode durchzuforsten, um zu sehen, wo irgendwas nicht paßt.

Wieso beläßt du die Function zum Einlesen der PDF-Datei in ein Blobfeld nicht so, wie ich sie dir gezeigt habe, und erledigst alles andere in der aufrufenden Methode? Dann könntest du nämlich deine Daten_To_Blob-Funktion für alle denkbaren Fälle verwenden, auch zum Einlesen von Bildern oder sonstwas, auch zum Einlesen in andere Blob-Felder usw. Zudem würde dein Code dadurch übersichtlicher. Lokalisiere also in der aufrufenden Methode den gewünschten Datensatz, setze deine Table-Komponente auf Append, Insert oder Edit, rufe die Einlese-Function auf und übergebe ihr die beiden Parameter Dateiname und Blobfeld, und danach machst du in der aufrufenden Methode Post und gibst die erzeugte Table-Komponente wieder frei. Das wäre sauberer Programmierstil. Unsauber ist es, wenn man versucht, alles in eine Funktion oder Prozedur zu quetschen.

Blup 20. Aug 2013 17:29

AW: PDF in Datenbank speichern
 
Zitat:

Zitat von HolgerCW (Beitrag 1225512)
Habe es jetzt mal für mich etwas umgebaut:

Gibts da nicht auch irgendwo mal ein "Post" (damit die Daten zur Datenbank übertragen werden) und vieleicht auch ein Commit für die Transaktion?

Perlsau 20. Aug 2013 17:53

AW: PDF in Datenbank speichern
 
Zitat:

Zitat von Blup (Beitrag 1225541)
Zitat:

Zitat von HolgerCW (Beitrag 1225512)
Habe es jetzt mal für mich etwas umgebaut:

Gibts da nicht auch irgendwo mal ein "Post" (damit die Daten zur Datenbank übertragen werden) und vieleicht auch ein Commit für die Transaktion?

Das Post steht dort bereits: als letzte Zeile vor dem finally. Commit braucht er nur, wenn Autocommit auf False steht (bei mir meistens true).

HolgerCW 21. Aug 2013 09:18

AW: PDF in Datenbank speichern
 
Guten morgen zusammen,

mir ist nun aufgefallen, dass bei mir in der Zeile

Delphi-Quellcode:
S.CopyFrom(FileS, FileS.Size);
das FileS.Size = 0 ist ?

Ist das richtig ?

Gruss

Holger


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:45 Uhr.
Seite 3 von 4     123 4      

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