Announcement

Collapse
No announcement yet.

TBlobStream versus SQL

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

  • TBlobStream versus SQL

    Hallo,

    folgendes Problem:<BR>
    Ich muss in eine Datenbank ein Bild schreiben, das ist technisch kein Problem. Nach einiger Zeit jedoch (nach ca. 3000 Datensätzen d.h. 3000 Bildern) meldet mir SQL-Query "Nicht genügend Festplattenspeicher o.ä.". Jeder weitere Versuch, Bilder zu speichern scheitert mit oben genanntem Fehler.<BR>
    Die selbe Routine mit TBlobStream funktioniert hervorragend.<BR>
    Warum?<BR>
    <BR>
    <B>Quellcode TBlobStream</B><BR>
    <PRE>
    tables[TableID].edit;
    tables[TableID].FieldByName('Zeit').asDateTime := time;
    tables[TableID].FieldByName('Datum').asDateTime := date;
    tables[TableID].FieldByName('Text').asString := text;
    tables[TableID].FieldByName('Place').asString := place;
    PicJPEG.CompressionQuality := Compression.Position;
    TempStream := Tables[TableID].CreateBlobStream(Tables[TableID].FieldByName('Pic'), bmReadWrite);
    Pipe := TMemoryStream.Create;
    TRY
    PicBitmap.Assign(pic^);
    PicJPEG.assign(PicBitmap);
    PicJPEG.Compress;
    PicJPEG.SaveToStream(Pipe);
    Pipe.Position := 0;
    TempStream.CopyFrom(pipe, pipe.size);
    FINALLY
    TempStream.Free;
    Pipe.Free;
    END;
    Tables[TableId].Post;
    </PRE>
    <BR>
    <B>Quellcode SQLQuery</B><BR>
    <PRE>
    id:=Tables[TableID].FieldByName('ID').AsInteger;
    Query.SQL.Clear;
    SQL := 'UPDATE "' + GetDatabaseName(TableID) + '" ';
    SQL := SQL + 'SET Zeit = :Zeit, Datum = atum, Text = :Text, Place= :Place, Pic = :Pic WHERE ID = :ID';
    Query.sql.add(SQL);
    Query.ParamByName('ID').asInteger := ID;
    Query.ParamByName('Zeit').asDateTime := time;
    Query.ParamByName('Datum').asDateTime := date;
    Query.ParamByName('Text').asString := text;
    Query.ParamByName('Place').asString := place;
    SavePicturePipe.Clear;
    PicJPEG.CompressionQuality := Compression.Position;
    PicBitmap.assign(pic^);
    PicJPEG.assign(PicBitmap);
    PicJPEG.Compress;
    PicJPEG.SaveToStream(SavePicturePipe);
    Query.ParamByName('Pic').LoadFromStream(SavePictur ePipe, ftBlob);
    Query.ExecSQL;
    </PRE>

    Vielen Dank im voraus für die Hilfe..

  • #2
    Du könntest es mal mit einmaligen Prepare am Anfang und UnPrepare am Ende versuchen. Das ist ja genau für den Fall, wenn sich nur der Parameter ändert...<p>
    Schöne Grüße, Mario Noac
    Schöne Grüße, Mario

    Comment


    • #3
      leider habe ich diese Antwort nicht im Kontext verstanden..<BR>
      ist Prepare nun für die SQL-Lösung oder für TBlobStream gedacht?
      Wie lautet der Syntax und eigentlich noch wichtiger: was ist Funktion und Sinn dieses Befehls

      Comment


      • #4
        Prepare ist speziell dafür, wenn man viele SQL-Befehle hintereinander absetzt, wo sich nur der Parameter ändert:<p>
        <pre>Query.SQL := ...<br>
        Query.Prepare;<br>
        Schleife: <br>
        Query.Params[?] := ?
        Query.ExecSQL;<br>
        Query.UnPrepare;<br></pre><p>
        So müsste es korrekt sein. Evtl. behebt das das SPeicherproblem bei <b>ExecSQL</b>.<p>
        Schöne Grüße, Mario Noac
        Schöne Grüße, Mario

        Comment

        Working...
        X