Announcement

Collapse
No announcement yet.

Dateien in DB speichen und auslesen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Dateien in DB speichen und auslesen

    Hallo ihr alle,

    hat jemand schon mal so etwas gemacht, wie es in Outlook beim Mail mit Anhängen funktioniert. Ich möchte Dokumente in der DB speichern, was ja alles schon funktioniert, und diese per Doppelklick öffnen. Das Problem ist nun folgendes: Die Dateien werden ins Temp-Verzeichnis gespeichert, und von dort über ein ShellExecute geöffnet. So weit so gut, aber ich möchte nach dem schliessen des Programms die Änderungen welche gemacht wurden, direkt wieder in die DB einlesen und die Files im Temp-Ordner wieder löschen. Outlook kann das. Nur weiss jemand wie die das machen ???????????

    Das mit dem Test die Dateien umzubenennen um zu wissen ob sie geöffnet sind oder nicht, geht nicht bei alles Files, da z.B. Txt-Dateien welche automatisch mit Notepad geöffnet werden z.B. nicht gesperrt werden.

    Für jede Hilfe dankbar.

    mfg

    Astner Klaus

  • #2
    Hallo,

    ich verwende dazu TOLEContainer. Wird in der proc angelegt da der Nutzer theoretisch mehrere aufmachen kann und dafür je ein Container da sein muss. (q1 ist bei mir eine Query / MySQL)
    (Wichtig: die maximale Blobgröße muss bspw. bei MySQL eingestellt werden.)

    var
    ms: TMemoryStream;
    oc: TOLEContainer;
    begin
    ...
    ms:=TMemoryStream.Create;
    oc:=TOLEContainer.Create(self);
    try
    q1.SQL.Text:=' ... '; // entspr. Satz öffnen
    q1.Open;
    // ... Test ob Satz da ist
    oc.Parent:=self;
    oc.AllowInPlace:=False;
    oc.AllowActiveDoc:=False;
    oc.Visible:=false;
    oc.Caption:=' ... '+inttostr( Zaehler );
    TBlobField(q1.FieldByName('Kontainer')).SaveToStre am(ms);
    ms.Position:=0;
    oc.LoadFromStream(ms);
    ms.Clear;
    q1.close;
    oc.DoVerb(ovShow);
    inc(Anlagen);
    while oc.State=osOpen do Application.ProcessMessages;
    dec(Anlagen);
    q1.SQL.Text:=' ... '; // entspr. Satz öffnen
    q1.Open;
    // ... Test ob Satz da ist
    q1.Edit;
    oc.SaveToStream(ms);
    ms.Position:=0;
    TBlobField(q1.FieldByName('Kontainer')).LoadFromSt ream(ms);
    q1.Post;
    q1.Close;
    ....

    angelegt wird das mit derselben Technik. Man kann auch abfragen ob das Blop leer ist und in diesem Fall das Objekt anlegen:

    if oc.InsertObjectDialog then begin
    oc.SaveToStream(ms);
    ...

    Was hier noch fehlt ist die Behandlung der Sperren, d.h. der Satz muss für andere in der Zeit gesperrt werden. Habe dazu eine eigene Tabelle. (Man muss dabei aber dann auch auf evtl. hängen gebliebene Sperren achten. Bspw. bei Programmstart, wenn noch nichts offen ist, alle eigenen Sperren löschen (doppelte Programmausführung verhindern!).

    Hinweis: Dateien die mit LoadFromFile im Blob landen sind damit nicht kompatibel.

    Gruß Matthia

    Comment


    • #3
      Hallo Herr Meyer,

      ich habe es versicht, aber bei mir kam immer ein Fehler dass er vom Stream nicht lesen kann. Dann habe ich es vom File versucht, das geht auch nicht. Habe hier im Anhang ein Beispiel. Wenn sie es sich evtl. bitte mal anschauen könnten.

      mfg

      und danke einstweilen

      Astner Klau

      Comment


      • #4
        Hallo Herr Astner,

        habe es mal probiert. Mit folgenden Änderungen geht es:

        oc.LoadFromFile

        Diese Zeile weg, dafür

        oc.Parent:=self; // Sonst: "Hat kein übergeordnetes Fenster"
        oc.AllowInPlace:=False; // kann evtl. weg
        oc.AllowActiveDoc:=False; // Sonst: "...kann nicht Fokus erhalten"
        oc.Visible:=false; // Liegt sonst irgendwo sichtbar herum.
        oc.CreateObjectFromFile('c:\test.doc', false)

        Comment


        • #5
          Danke,

          jetzt funzt es.

          Dank

          Comment

          Working...
          X