var
mslr,msda:tmemorystream;
begin
    panel4.Enabled:=true;
    n15.Enabled:=true;
    mslr:=tmemorystream.Create;
    msda:=tmemorystream.Create;
    olecontainer1.SaveToStream(mslr);
    olecontainer2.SaveToStream(msda);
    clientdataset2.Edit;
    clientdataset2lr.LoadFromStream(mslr);
    clientdataset2lrda.LoadFromStream(msda);
    clientdataset2.fieldbyname('tmm').asstring:=TabControl1.tabs[tabcontrol1.tabindex]+inttostr(clientdataset2.fieldbyname('tid').asinteger);
    clientdataset2.post;
    clientdataset2.applyupdates(-1);
    mslr.Free;
    msda.Free;
end;上面是我以前写的保存的例子没有用问题的,可以。

解决方案 »

  1.   

    var
      Mem:TMemoryStream;
        Mem := TMemoryStream.Create;
        Mem.LoadFromFile(FileName);
        Mem.Seek(0,soFromBeginning);   
        Query1.Close;
        Query1.SQL.Clear;
        Query1.SQL.Add('INSERT INTO BLOBNAME(NAME,FILENAMES) VALUES(:NAME,:FILENAMES)');
        Query1.ParamByName('Name').AsString := FileName;
        Query1.ParamByName('FileNAMES').LoadFromStream(Mem,ftBlob);
        Query1.ExecSQL;
        Mem.Free;
      

  2.   

    begin
      ClientDataSet1.Append;
      ClientDataSet1.FieldByName('ID').AsInteger := 1;
      ClientDataSet1.FieldByName('Name').AsString := 'Borlandor';
      Stream := TMemoryStream.Create;
      Image1.Picture.Graphic.SavetoStream(Stream);
      Stream.Position := 0;
      ClientDataSet1.FieldByName('Photo').LoadFromStream(Stream);
      ClientDataSet1.Post;
      ClientDataSet1.ApplyUpdates(-1);
      Stream.free;
    end;友情提醒:
      三层的Blob数据不能依靠ClientDataSet1.CommandText中的SQL语句插入,
    只能依靠上面这种“字段+流”的方式来实现。
      二层的可以参见cg1120提供的方式来实现,当然也可使用“字段+流”的方式。
      

  3.   

    我下面的程序有错吗?错在那里?能实现这样的功能吗?
    var MemoryStream:TMemoryStream;
    begin
        MemoryStream:= TMemoryStream.Create;
        try
            TBlobField(cds_data.FieldByName('sqwd')).SaveToStream(MemoryStream);
            MemoryStream.Position := 0;
            OleContainer1.LoadFromStream(MemoryStream);//执行到此,出错!
            //OleContainer1.Refresh;
        finally
            MemoryStream.Free;
        end;
      

  4.   

    如果你的字段里保存的不是一个ole字段,那么字就会出错。
    而且如果是,你应该用TOLEStream而不是TMemoryStream.
      

  5.   

    我遇到的问题是用流把OleContainer中的文档保存到数据库,记录变化时在从数据库中取出更新OleContainer内容,下面分别是这两段程序:(出错部分注释)
    程序1。(保存到数据库)
    ============
    var MemoryStream:TMemoryStream;
    begin
        MemoryStream:= TMemoryStream.Create;
        try
            OleContainer.SaveToStream(MemoryStream);
            MemoryStream.Position := 0;
            cds.Edit;
            TBlobField(cds.FieldByName(fieldname)).LoadFromStream(MemoryStream);
            cds.Post;
        finally
            MemoryStream.Free;
        end;
    =================================
    程序2。(从数据库中取出,更新OleContainer内容)
    ============
    var MemoryStream:TMemoryStream;
    begin
        MemoryStream:= TMemoryStream.Create;
        try
            TBlobField(cds.FieldByName(fieldname)).SaveToStream(MemoryStream);
            MemoryStream.Position := 0;
            OleContainer.LoadFromStream(MemoryStream);//出错处!!(错误提示'Stream read error'!对刚保存过数据无误,但重新启动打开时有误)
            //OleContainer.Refresh;
        finally
            MemoryStream.Free;
        end;
    ==============
    根据错误提示(对刚保存过数据无误,但重新启动打开时有误)我做出判断:
    1。数据未保存;
    2。流的类型错误。望您指教!
      

  6.   

    procedure TForm1.Button1Click(Sender: TObject);
    var MemoryStream:TMemoryStream;
    begin
        ClientDataSet1.Open;
        MemoryStream:= TMemoryStream.Create;
        try
            OleContainer1.SaveToStream(MemoryStream);
            MemoryStream.Position := 0;
            ClientDataSet1.First;
            ClientDataSet1.Edit;
            TBlobField(ClientDataSet1.FieldByName('Photo')).LoadFromStream(MemoryStream);
            //ClientDataSet1Photo.LoadFromStream(MemoryStream);
            ClientDataSet1.Post;
            ClientDataSet1.ApplyUpdates(-1);//这句是必须的。    finally
            MemoryStream.Free;
        end;
    end;procedure TForm1.Button2Click(Sender: TObject);
    var MemoryStream:TMemoryStream;
    begin
        MemoryStream:= TMemoryStream.Create;
        try
            TBlobField(ClientDataSet1.FieldByName('Photo')).SaveToStream(MemoryStream);
            MemoryStream.Position := 0;
            OleContainer2.LoadFromStream(MemoryStream);//不出错,内容正确!
            //OleContainer.Refresh;
        finally
            MemoryStream.Free;
        end;end;
    友情提醒:
        Delphi BDE中的TQuery组件不支持Oracle某些版本Blob数据的读写。
    必须以TTable来代替。
      

  7.   

    你把DataSetProvider1的属性OPTIONS里的poFetchblobsondemand 为TRUE看看。