Announcement

Collapse
No announcement yet.

Im Blob z.B. Word-Dokument oder PDF speichern

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

  • Im Blob z.B. Word-Dokument oder PDF speichern

    Hallo,
    das ist meine IB-Table:
    CREATE TABLE TEST
    (
    SIMFIRMA VARCHAR(3) NOT NULL,
    LFDNR VARCHAR(5) NOT NULL,
    BESCHREIBUNG BLOB SUB_TYPE TEXT SEGMENT SIZE 6144,
    PRIMARY KEY (SIMFIRMA, LFDNR)
    );

    Ich möchte über IBSQL bestimte Daten auswählen und über DataSetProvider die Daten an ClientDataSet übergeben (was auch funktioniert).

    In mein BLOB - BESCHREIBUNG möchte ich z.B. eine PDF- oder DOC-Datei speichern.
    Das Beispiel habe ich aus einem hier gepostetem Eintrag übernommen:

    procedure TForm1.Button4Click(Sender: TObject);
    var blob: TBlobStream;
    FName : string;
    field_name : string;
    begin
    screen.Cursor := crHourglass;
    FName := 'c:\blob.doc';

    //cd1 ist ClientDataset
    blob := cd1.CreateBlobStream(cd1.FieldByName('Beschreibung '), bmWrite);
    try
    blob.Seek(0, soFromBeginning);
    fs := TFileStream.Create('c:\blob.doc', fmOpenRead or
    fmShareDenyWrite);
    try
    blob.CopyFrom(fs, fs.Size)
    finally
    fs.Free
    end;
    finally
    blob.Free
    end;

    screen.Cursor := 0;

    end;

    Leider bekomme ich die Meldung "Inkompatible Typen: 'TBlobStream' und 'TStream'" - an dieser Stelle blob := cd1.CreateBlobStream(cd1.FieldByName('Beschreibung ')

    Vielen Dank für euere Hilfe

  • #2
    Hallo Sladjana,<BR>
    die Variable blob muss vom Typ TStream sein.
    Für das Speichern von Dateien nehme ich auch immer Blob SubType 0.
    Es sollte aber auch einfacher gehen:
    TBlobField(cd1.FieldByName('Beschreibung')).LoadFr omFile(FName);
    <BR>
    Gruss, Fran

    Comment


    • #3
      Danke Frank,

      vielen Dank für die schnelle Antwort.

      ja, habe es dann doch rausgefunden - bekomme auch keine Fehlermeldung mehr, aber mein blob-Feld in der IB-Tabelle bleibt leider leer.

      Ich habe inzwischen auch einiges ausprobiert, jedoch ohne Erfolg.

      Es wäre super, wenn du kleines Beispiel posten oder per eMail (s.topalovic at interstuhl.de) senden könntest - irgendwas übersehe ich.

      Vielen, vielen Dan

      Comment


      • #4
        Hallo Sladjana,<BR>
        ich kenne mich leider mit ClientDataSet nicht aus, da ich mit IBO arbeite.
        Ich vermisse in deiner Routine nur das Edit und das Post und evtll. das ApplyUpdates.<BR>
        Gruß, Fran

        Comment


        • #5
          Hallo Frank,

          dankeschön! Inzwischen habe ich es doch noch hinbekommen, mein Blob zu füllen, aber direkt über IBTable.

          Über ClientDataSet funktioniert es noch nicht, aber das ist auch nicht schlimm. Ich übergebe die Daten (als Stream) vom Client an den XServer und der speichert die Daten dann direkt in die IBTable ab - will sowieso nicht direkt vom Client auf Interbase-DB Zugriff haben.

          Vielen Dank nochmal für deine Hilfe

          Sladjana

          P.S. meine Test-Quelle:

          var datei,blob:TStream;

          ibtable1.Active := true;
          ibtable1.Insert;
          ibtable1.FieldByName('lfdnr').value := edit1.Text;
          ibtable1.FieldByName('simfirma').value := '011';
          ibtable1.Post;

          ibtable1.Active := false;
          ibtable1.Open;
          ibtable1.Edit;

          blob:=form1.IBtable1.CreateBlobStream(IBtable1.Fie ldByName('beschreibung'),bmWrite);
          try
          blob.Seek(0,soFromBeginning);
          datei:=TFileStream.Create('C:\logo.bmp',fmOpenRead or fmShareDenyWrite);
          try
          blob.CopyFrom(datei,datei.Size);
          IBtable1.Post;
          finally
          datei.Free;
          end;
          finally
          blob.Free;
          end

          Comment


          • #6
            Hallo Sladjana,
            was passiert, wenn Du nach dem CreateBlobStream(...) folgende Zeile einfügst?
            <code>
            blob.Position := 0;
            </code>
            Thoma
            Thomas Steinmaurer

            Firebird Foundation Committee Member
            Upscene Productions - Database Tools for Developers
            Mein Blog

            Comment


            • #7
              Hallo Thomas,

              meinst du mit ClientDataSet?? Blob-Feld bleibt leer.

              Nochmal mein Versuch (als Quelle):

              var datei,blob:TStream;
              begin
              cd1.Active := false; //(cd1 - ClientDataSet)
              ibquery1.Active := false;
              ibquery1.SQL.Clear;
              ibquery1.SQL.Add('select * from test where simfirma ='+quotedstr('011')+' and lfdnr='+quotedstr(edit1.Text));
              ibquery1.Open;
              cd1.Open;
              if cd1.RecordCount > 0 then
              begin
              cd1.Edit;

              blob:=form1.cd1.CreateBlobStream(cd1.FieldByName(' beschreibung'),bmWrite);
              try
              blob.Seek(0,soFromBeginning);
              blob.Position := 0;
              datei:=TFileStream.Create('C:\blob.doc',fmOpenRead or fmShareDenyWrite);
              try
              blob.CopyFrom(datei,datei.Size);
              cd1.Post;
              cd1.ApplyUpdates(0);
              ibtransaction1.Commit;
              finally
              datei.Free;
              end;
              finally
              blob.Free;
              end;

              end;
              cd1.Close;
              ibquery1.close

              Comment

              Working...
              X