Results 1 to 7 of 7

Thread: Blobs met FireDact

  1. #1
    Senior Member
    Join Date
    Jul 2005
    Location
    Te mooi om waar te zijn..........
    Posts
    916

    Blobs met FireDact

    Hallo allemaal,

    in D7 gebruikte ik volgende code om blobs naar Firebird te schrijven en van te lezen

    HTML Code:
    type
      TBody = record
        Inhoud : WideString;
      end;
    var Field  : TBlobField;
        Stream : TStream;
        Body   : TBody;
    
    //schrijven
     Body.Inhoud := Memo9.Lines.Text;
     Field       := TBlobField(FDTable1.FieldByName('NOTITIES'));
     Stream      := FDTable1.CreateBlobStream(Field, bmWrite);
     try
       Stream.Write(Body.Inhoud[1], Length(Body.Inhoud) * SizeOf(WideChar));
     finally
       Stream.Free;
     end;
    
    //lezen
      Body.Inhoud := '';
      Field       := TBlobField(FDTable1.FieldByName('NOTITIES'));
      Stream      := FDTable1.CreateBlobStream(Field, bmRead);
      try
        SetLength(Body.Inhoud, Stream.Size div SizeOf(WideChar));
        Stream.Read(Body.Inhoud[1], Stream.Size);
      finally
        Stream.Free;
      end;
      Memo9.Lines.Text := Body.Inhoud;
    En dat werkt perfect, maar niet in D10.3 met FD en met wat ik op het internet vind kom ik er niet uit. Wie kan mij hier op weg helpen hoe het met FD wel moet.

    Alvast bedankt Frank

  2. #2
    Gevaarlijk om ervanuit te gaan dat die TStream uit CreateBlobStream de TStream.Size gedefinieerd heeft. Maar goed, ik denk wel dat die geïmplementeerd is in de returnstream.

    Wat gaat er precies fout?

    (Ik neem aan dat je daadwerkelijk dit voorbeeld gebruikt hebt en niet een complexere code versimpeld hebt zonder te testen dat het nog steeds niet werkt !!)

  3. #3
    Senior Member
    Join Date
    Jul 2005
    Location
    Te mooi om waar te zijn..........
    Posts
    916
    de code zoals ik die hierboven heb staan is zoals ik die altijd in D7 met succes gebruikt hebt. Nu onder D10.3.1 loopt de code ook gewoon door, echter er wordt niets opgeslagen in de database als ik het weg schrijf en niets geladen als ik vd database lees.

    op internet heb ik het volgende gevonden:

    HTML Code:
    procedure SaveToFireDACBlob;
    var
    MemStream: TMemoryStream;
    begin
    FireDAC.Connected := True;
    MemStream := TMemoryStream.Create;
    try
    Image1.Bitmap.SaveToStream(MemStream);
    MemStream.Seek(0,0);
    FDQueryInsert.ParamByName('Media').LoadFromStream(MemStream,ftBlob);
    FDQueryInsert.ParamByName('MType').AsString := '0';
    FDQueryInsert.ExecSQL();
    except
    on e: Exception do
    begin
    //ShowMessage(e.Message);
    end;
    end;
    MemStream.Free;
    FireDAC.Connected := False;
    end;
     
    procedure LoadFromFireDACBlob;
    var
    BlobStream: TStream;
    begin
    FireDAC.Connected := True;
    try
    FDQuerySelect.Open;
    FDQuerySelect.First;
    while(not FDQuerySelect.EOF)do begin
    // access a stream from a blob like this
    BlobStream := FDQuerySelect.CreateBlobStream(FDQuerySelect.FieldByName('Media'),TBlobStreamMode.bmRead);
    // access a string from a field like this
    if (FDQuerySelect.FieldByName('MType').AsString='0') then
    begin
    // load your blob stream data into a control
    ImageViewer.Bitmap.LoadFromStream(BlobStream);
    end;
    BlobStream.Free;
    FDQuerySelect.Next;
    end;
    except
    on e: Exception do
    begin
    //ShowMessage(e.Message);
    end;
    end;
    FireDAC.Connected := False;
    end;
    Maar daar kom ik niet veel verder mee, ik loop al vast bij FireDac.Connected. Het moet via TFDDataSet.LoadFromStream() plaats vinden maar ik vind die TFDDataSet nergens.

  4. #4
    Quote Originally Posted by FrankH View Post
    Maar daar kom ik niet veel verder mee, ik loop al vast bij FireDac.Connected. Het moet via TFDDataSet.LoadFromStream() plaats vinden maar ik vind die TFDDataSet nergens.
    Je FDQuerySelect is de TFDDataSet neem ik aan.

    Maar de LoadFromStream van TFDDataSet staat volgens mij ergens anders voor. Dat is om een complete dataset naar stream te schrijven. Dat wil jij niet.

    Ik moet zeggen dat ik eigenlijk nooit met TDataSet.CreateBlobStream gewerkt heb. Ik heb altijd TBlobField(Query.FieldByName('DATA')).LoadFromStre am(Stream)) gebruikt. Maar TBlobField.LoadFromStream() doet ook gewoon een DataSet.CreateBlobStream() dus dat maakt niets uit.

    Maar jij doet ook een FDQueryInsert.ParamByName('Media').LoadFromStream( MemStream,ftBlob). Ik heb geen ervaring met FireDac maar zou dat misschien dit moeten zijn:
    Delphi Code:
    1. FDQueryInsert.ParamByName('Media').AsStream := MemStream;

  5. #5
    Senior Member
    Join Date
    Jul 2005
    Location
    Te mooi om waar te zijn..........
    Posts
    916
    ik begrijp deze regel niet: FDQueryInsert.ParamByName('Media').AsStream := MemStream;

    Waar wordt nu dan bepaald in welke tabel en welke regel die Blob komt?

  6. #6
    Senior Member
    Join Date
    Jul 2005
    Location
    Te mooi om waar te zijn..........
    Posts
    916
    Ik heb het nu als volgt:

    HTML Code:
        MemStream := TMemoryStream.Create;
        Memo9.Lines.SaveToStream(MemStream);
        MemStream.Seek(0,0);
        ParamByName('NOTITIES').LoadFromStream(MemStream,ftBlob);
        ExecSQL;
    
        FDConnection1.Commit;
    
        MemStream.Free;
    Nu wordt de data naar de db weggeschreven alleen als ik ze dan weer inlees zijn het onleesbare karakters geworden.
    Het terug lezen doe ik nog steeds als:

    HTML Code:
      Body.Inhoud := '';
      Field       := TBlobField(FDTable1.FieldByName('NOTITIES'));
      Stream      := FDTable1.CreateBlobStream(Field, bmRead);
      try
        SetLength(Body.Inhoud, Stream.Size div SizeOf(WideChar));
        Stream.Read(Body.Inhoud[1], Stream.Size);
      finally
        Stream.Free;
      end;
      Memo9.Lines.Text := Body.Inhoud;
    wat klopt er nog niet?

  7. #7
    Senior Member
    Join Date
    Jul 2005
    Location
    Te mooi om waar te zijn..........
    Posts
    916
    Opgelost

    Het lezen was dus nog niet juist.

    Dat moet nu als volgt:

    HTML Code:
        BlobStream := FDTable1.CreateBlobStream(FDTable1.FieldByName('NOTITIES'),TBlobStreamMode.bmRead);
        Memo9.Lines.LoadFromStream(BlobStream);
    waarbij BlobStream :TStream gedeclareerd is.

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •