直接用TClientDataset与服务器连接,保存就可以.

解决方案 »

  1.   

    这种方法我测试过:
       TClientDataset端用参数方式把二进制数据写入,有时要少1字节,如保存20000字节,实际只保存19999字节,数据由 chr(1)-chr(255)循环产生
      

  2.   

    刚刚解决这个问题.做的项目是一个办公自动化系统.在公文传输中,比如发通知的时候可以带n多的附件,附件可能是任何类型的东东儿.方法步骤如下:
     
    1.将应用程序服务器端对应datasetprovider的options的fetchblobondemand选项设为true,因为false情况下,客户端的clientdataset是不取blob数据的.或者在 false情况下用clientdataset的fetchblob方法取得数据库中的数据.
    2.源程序如下(win2000/delphi/ocracle)
    procedure writetoblobfield;
    var
    tfStream:TFileStream;
    tbStream:TBlobStream;
    nbufsize:integer;
    pbuf:PChar;
    begin
    With clientdataset1 do
    begin
    if Active = false then
    Active := true;
    Append;
    try
    tfStream:=TFileStream.Create(FilePath,fmOpenRead);
    nbufsize:=tfStream.Size +1;
    pbuf:=AllocMem(nbufsize);
    tfStream.Read(pbuf^,nbufsize);
    tbStream:=TBlobStream.Create((fieldbyname('TestImage') as TBlobField),bmWrite);
    tbStream.Seek(0,SoFromBeginning);
    tbStream.Write(pbuf^,nbufsize);
    finally
    tfStream.Free ;
    tbStream.Free ;
    post;
    FreeMem(pbuf,nbufsize);
    Active:=False;
    end;
    end;
    end;procedure savetoclient;
    var
    filebody:tstream;
    tempfile:tmemostream;
    begin
    try
    filebody:=clientdataset.createblobstream(Tblobfield,bmread);
    filebody.position:=0;
    tempfile:=tmemostream.create;
    tempfile.loadfromstream(filebody);
    tempfile.savetostream(文件名);
    finally
    tempfile.free;
    filebody.frdd;
    end;
    end;
    end;