Announcement

Collapse
No announcement yet.

Anfänger-Frage: BLOBs

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

  • Anfänger-Frage: BLOBs

    Hallo,
    ich bin noch etwas unsicher im Umgang mit Blobfeldern - entsprechend trivial wird sih mein Problem anhören... ich fang einfach an:

    <PRE>
    SQL.Text := 'select * from EMAIL_BLOB_I (?fk_emailpart, ?inhalt)';<BR> ParamByName('fk_emailpart').AsInteger := vPartindex;<BR>if (MessageParts[vi] is TIdAttachment) then<BR>begin<BR>vstream := TStringStream.Create('');<BR>TIdAttachment(Message Parts[vi]).Encode(vStream);<BR>
    vStream.Position := 0; <BR>ParamByName('inhalt').AsString := vStream.DataString;<BR></PRE>
    Ich speichere alle Parts einer Email (die ich mit Indy-Kompos per POP abrufe) separat in einer Interbase-Datenbank (7.0, IBOBjects) ab.
    Bei Textinhalten funzt das ganz gut, nur bin ich mir bei Anhängen nicht sicher, ob die auch richtig in der Datenbank abgelegt werden.
    Mein Ansatz zum Öffnen/Auslesen der Attachments aus der DB wäre:
    <PRE>
    sql.Text := 'select inhalt from email_blob where ID = '+inttostr(gvAnlagenarray[lvAnhaenge.ItemIndex].id);<BR>prepare;<BR>
    open;<BR>vStream.LoadFromStream(CreateBlobStream(f ieldbyName('inhalt'),bmRead));<BR>
    </PRE>

    Ich hab zunächst mal mit FileStream gearbeitet und die Datei erst mal auf der Platte gespeichert, sie lässt sich aber nicht mehr öffnen. Also das ganze BLOB-Handling scheint bei mir noch sehr im argen zu liegen.
    Kann mir da bitte jemand unter die Arme greifen? Wäre toll, danke!
    Simon

  • #2
    Hallo,

    mit Beispielen für IBObjects kann ich nicht dienen, ich habe nur Beispiele für die BDE, IBX oder ADO am Lager.

    Generell sollte man auf die Vorteile der visuellen Anwendungsentwicklung mit Delphi zurückgreifen, was in diesem Fall bedeutet, dass die SQLs fest im Objektinspektor zugewiesen werden, um dort auch die Parameter-Kollektionen zu füllen. Wenn dann auch noch zur Entwicklungszeit persistente TField-Instanzen angelegt werden, kann man fast nichts mehr falsch machen. Der folgende Auszug stammt aus einem IBX-Projekt, dort werden die gerade angesprochenen Punkte berücksichtigt:
    <pre>
    <b>procedure</b> TDM.ExportProjectFiles(ExportPath: <b>String</b>);
    <b>resourcestring</b>
    cErrNoPath = <font color="#9933CC">'Der Exportpfad &quot;%s&quot; ist ungültig'</font>;
    cErrNoData = <font color="#9933CC">'TBlobStream enthält keine Daten!'</font>;
    <b>var</b>
    sExportName : <b>String</b>;
    Count : Integer;
    InFile : TStream;
    OutFile : TStream;
    ZStream : TCustomZLibStream;
    <b>begin</b>
    <font color="#003399"><i>// Zielverzeichnis gültig?</i></font>
    <b>if</b> Length(ExportPath) = 0
    <b>then</b> <b>raise</b> Exception.CreateFmt(cErrNoPath, [ExportPath]);
    <font color="#003399"><i>// alle Projektdateien auslagern</i></font>
    <b>with</b> IBQueryExportFiles <b>do</b>
    <b>begin</b>
    <b>try</b>
    <font color="#003399"><i>// Projektnummer als Parameter übergeben</i></font>
    Params[0].Value := IBDataSetProVerVERNR.Value;
    Open;
    <b>with</b> FormExport.ProgressBar1 <b>do</b>
    <b>begin</b>
    Max := RecordCount;
    Step := 1;
    <b>end</b>;
    <b>while</b> <b>not</b> EOF <b>do</b>
    <b>begin</b>
    sExportName := ExportPath + IBQueryExportFilesFILENAME.Value;
    <font color="#003399"><i>// ZLib</i></font>
    InFile := IBQueryExportFiles.CreateBlobStream(
    IBQueryExportFilesFILEDATA, bmRead);
    <font color="#003399"><i>// wurden Daten aus dem Blob-Feld gelesen ?</i></font>
    <b>if</b> InFile.Size = 0 <b>then</b>
    <b>begin</b>
    InFile.Free;
    ShowMessage(cErrNoData);
    Exit;
    <b>end</b>;
    <b>try</b>
    <font color="#003399"><i>// Exportdatei anlegen (Exportpfad + Dateiname)</i></font>
    OutFile := TFileStream.Create(sExportName, fmCreate <b>or</b> fmOpenWrite);
    <b>try</b>
    <font color="#003399"><i>// komprimierte Blob-Daten entkomprimieren</i></font>
    ZStream := TDecompressionStream.Create(InFile);
    <b>try</b>
    <font color="#003399"><i>// in 4096-Byte Häppchen in die Datei schreiben</i></font>
    <b>while</b> True <b>do</b>
    <b>begin</b>
    Count := ZStream.<b>Read</b>(ZLibBuffer, ZLibBufferSize);
    <b>if</b> Count &lt;&gt; 0
    <b>then</b> OutFile.WriteBuffer(ZLibBuffer,Count)
    <b>else</b> Break;
    <b>end</b>;
    <b>finally</b>
    <font color="#003399"><i>// Free -&gt; Buffer wird geleert</i></font>
    ZStream.Free;
    <b>end</b>;
    <b>finally</b>
    OutFile.Free;
    <b>end</b>;
    <b>finally</b>
    InFile.Free;
    <b>end</b>;
    FormExport.ProgressBar1.StepIt;
    Next;
    <b>end</b>;
    <b>finally</b>
    Close;
    FormExport.ProgressBar1.Position := 0;
    <b>end</b>;
    <b>end</b>;
    <font color="#003399"><i>// Feld ABSCHLUSS in ProVer aktualisieren</i></font>
    <b>with</b> IBSP_ProVerExport <b>do</b>
    <b>begin</b>
    Params[0].Value := IBDataSetProVerVERNR.Value;
    Execproc;
    <b>end</b>;
    <font color="#003399"><i>// Anzeige aktualisieren</i></font>
    IBDataSetProVer.Refresh;
    <b>end</b>;
    </pre&gt

    Comment

    Working...
    X