通常是这样的,多层结构应该差别不大吧
读出数据:
var
  sm: TStream;
begin
  with ADOQuery1 do
  begin
    sm := CreateBlobStream(FieldByName('sample'), bmRead);
  end;
  OleContainer1.LoadFromStream(sm);
  sm.Free;
end;
写入数据:
var
   sm: TStringStream;
begin
  sm := TStringStream.Create('');
  OleContainer1.CreateObjectFromFile('C:\sample.doc', true);
  OleContainer1.SaveToStream(sm);
  sm.Position := 0;
  with ADOQuery1 do
  begin
    FieldByName('sample').AsString := sm.DataString;
    ExecSQL;
  end;
  sm.Free;
end;

解决方案 »

  1.   

    使用OleVariant变量传输做两个方法://服务器端,将OleVariant转化为TStream
    procedure TCtrlCDM.VariantToStream(const Data: OleVariant;
      Stream: TStream);
    var
      p: Pointer;
    begin
      p := VarArrayLock(Data);
      try
        Stream.Write(p^, VarArrayHighBound(Data,1) + 1);  //assuming low bound = 0
      finally
        VarArrayUnlock(Data);
      end;
    end;//客户端,将TStream转化为OleVariant
    function StreamToVariant(Stream: TStream): OleVariant;
    var
      p: Pointer;
    begin
      Result := VarArrayCreate([0, Stream.Size - 1], varByte);
      p := VarArrayLock(Result);
      try
        Stream.Position := 0;  //start from beginning of stream
        Stream.Read(p^, Stream.Size);
      finally
        VarArrayUnlock(Result);
      end;
    end;以图片来举例:  客户端
      msflow:=TMemoryStream.Create;
      mgflow.Picture.Bitmap.SaveToStream(msflow);
      ovflow:=StreamToVariant(msflow);  传递ovflow:OleVariant  服务器
      smflow:=TMemoryStream.Create;
      VariantToStream(pflow,smflow);//转化为TMemoryStream
      smflow.Position:=0;
      ADODB.SQL.Clear;
      ADODB.SQL.Add('insert into table (图片) values(:pflow)');
      ADODB.Parameters.ParamByName('pflow').LoadFromStream(smflow,ftBlob);
      ADODB.ExecSQL;  读方法反向编写即可。
    -------------------------------------------------------------------重点提示:三层结构中的Blob/image的读写不是大问题,最重要的是客户端  与服务器段的变量传递。