Announcement

Collapse
No announcement yet.

BLOB-Stream auslesen

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

  • BLOB-Stream auslesen

    Hallo,

    folgendes Problem:
    ich schreibe eine Stringlist in ein Blobstream, speicher das in der Datenbank und will es an anderer Stelle wieder auslesen. Allerdings bekomme ich beim Auslesen nur ein Count von 1 und von diesem einen String nur das erste Zeichen.

    Der Code dazu:
    Blob-Stream schreiben:
    ...
    sl : TStringList;
    slStream : TStream;
    ...
    sl := Tstringlist.Create;
    ...
    slStream := CreateBlobStream(FieldByName('BLOB'),bmWrite);
    sl.SaveToStream(slStream);
    slStream.Position := 0;
    slStream.Free;

    BLOB-Stream lesen:
    ...
    strList : TStringList;
    BLOB_STREAM : TStream;
    ...
    strlist := TstringList.Create();
    ...
    BLOB_Stream := AQ.CreateBlobStream(AQ.FieldByName('BLOB'), bmRead) ;
    ...
    sl_c := strList.Count;
    if sL_C > 0 then
    begin
    for y := 0 to sl_c - 1 do
    begin
    str := str + strList.Strings[y] + ', ';
    end;

    Weiß jemand was ich falsch mache???

    Vielen Dank!

    Lieschen

  • #2
    Fehlt da nicht LoadFromStream ??

    Comment


    • #3
      Stimmt, hab ich nur vergessen rein zu kopieren:

      strlist.LoadFromStream(BLOB_Stream);

      gehört vor dem Count nach die Zeile BLOB_Stream :=

      Comment


      • #4
        Weiß denn keiner warum das nicht geht???

        hab mir jetzt erstmal mit nem umweg über ein DBMemo beholfen, aber is ja keine Dauerlösung.

        Gruß,
        lieschen

        Comment


        • #5
          Originally posted by Lieschen View Post
          Weiß denn keiner warum das nicht geht???
          Hi Lieschen,

          der folgende Code funktioniert bei mir:

          Code:
          // Speichen
          procedure TForm26.Button1Click(Sender: TObject);
          Var
            AStream : TStream;
            AStrings: TStringList;
          begin
            AStrings := TStringList.Create;
            try
              AStrings.Assign(Memo1.Lines);
              qry.Edit;
              try
                AStream := qry.CreateBlobStream(qry.FieldByName('Text'), bmWrite);
                AStrings.SaveToStream(AStream);
              finally
                AStream.Free;
              end;
              qry.Post;
            finally
              AStrings.Free;
            end;
          end;
           
          // Laden
          procedure TForm26.Button2Click(Sender: TObject);
          Var
            AStrings: TStringList;
            AStream : TStream;
          begin
            AStrings := TstringList.Create();
            AStream := qry.CreateBlobStream(qry.FieldByName('Text'), bmRead);
            try
              AStrings.LoadFromStream(AStream);
              Memo1.Lines.Assign(AStrings);
            finally
              AStrings.Free;
              AStream.Free;
            end;
          end;
          Ich habe nur ein Memo zusätzlich zur Anzeige.
          Vielleicht solltest du den kompletten Code zeigen. Der Code von dir sollte so funktionieren.
          Hast du auch das Edit und Post der Datenmenge beim Schreiben?

          Cu, Frank

          [EDIT]
          und dann bleibt noch der Weg ohne Stream:
          Code:
          DatenMenge.FieldByName('BlobFeldName').AsString := StringListe.Text;
          Frank

          Comment


          • #6
            Ein generischer Ansatz zeigt das Speichern von Dokus in DBBlobs, wichtig ist den Seek() zu setzen:

            Code:
            procedure TCacheData.getDocufromBlob(blobfilename: shortstring; Vdataset: TIBQuery);
                                                                       
             var blob: TStream;
               fs: TFileStream;
            begin
              if blobfilename <> '' then begin
              cachedata.IBDatabase1.SQLDialect:= 1;
              with cachedata.IBtablemax do begin
               active:= true;
               Locate('ID',vdataset.fieldbyname('ID').AsInteger,[loCaseInsensitive]);
                 //IBtablemaxBLOBNAME: TBlobField;
                 blob:= createBlobStream(FieldByName('Blobname'),bmread);
                try
                  blob.Seek(0, soFromBeginning);
                  fs:= TFileStream.create(blobfilename, fmcreate or fmsharedenyWrite);
                  try
                    fs.copyFrom(blob, blob.size);
                  finally
                    fs.free;
                  end
                finally
                  blob.free;
                  cachedata.IBDatabase1.SQLDialect:= 2;
                end;
              end;
              end; //if
            end;
            und der Vollständigkeit halber der Schreib- und Speichervorgang als Code-Pattern:


            Code:
            procedure TCacheData.letDocuSaveasBlob2(blobfilename: shortstring; Vdataset: TIBQuery); 
                                                                                                  
               var  blob: TStream;
                 fs: TFileStream;
            begin
              if blobfilename <> '' then begin
              cachedata.IBDatabase1.SQLDialect:= 1;
              with IBtablemax do begin
                active:= true;
                if  Locate('ID', vdataset.fieldbyname('ID').AsInteger, [loCaseInsensitive]) 
                then begin
                   Edit;
                   //IBtablemaxBLOBNAME: TBlobField;
                   blob:= createBlobStream(FieldByName('Blobname'),bmwrite);
                try
                  blob.Seek(0, soFromBeginning);
                  fs:= TFileStream.create(blobfilename, fmopenRead or fmsharedenyWrite);
                  try
                    blob.copyFrom(fs, fs.size);
                    Post;
                  finally
                    fs.free;
                  end
                finally
                  blob.free;
                  cachedata.IBDatabase1.SQLDialect:= 2;
                end;
                end; // if
              end;   // with
              end; // if <> ''
            end;
            Zuletzt editiert von max kleiner; 30.10.2007, 18:48.

            Comment

            Working...
            X