TPho 是远程数据模板。
关键是参数应选什么类型!

解决方案 »

  1.   

    to : Liusp(夜深千帐灯) 
    不知道, 但我必须传, 你友好的解决方案吗 ?请赐教!
      

  2.   

    实验了一下,可以,和在C/S模式下没有太大的区别,就是直接用远程数据模块就可以了。我用DCOM试的,其他的应该也一样可以。
      

  3.   

    哦,我没有用存储过程,直接给BLOB字段赋值然后传了。
      

  4.   

    //procedure Tpho.InputPho(???: ???);
    procedure Tpho.InputPho(Pho:olevariant)
    var
    aproc: TAdoStoredProc;
    begin
    aproc.create(self);
    aproc.ProcedureName := 'sp_Add;1'
    aproc.Parameters.Refresh;
    aproc.Parameters[0].Value := Pho;
    aproc.ExecProc;
    end;//**********************************************
    //Client 
    function StringToVariantArray(const S: string): OleVariant;
    var
      P: Pointer;
    begin
      Result := NULL;
      if Length(S) > 0 then
      begin
        Result := VarArrayCreate([0, Length(S) - 1], varByte);
        P := VarArrayLock(Result);
        try
          Move(S[1], P^, Length(S));
        finally
          VarArrayUnlock(Result);
        end;
      end;
    end;
    客户端: 用conn: TSocketConnection 连接, 选中的图片已加入image1:TImage 中
    procedure TForm1.BitBtn1Click(Sender: TObject);//向库中插入一纪录
    var
      v:olevariant;
      MS:TMemoryStream;
      s:string;
    begin
      MS := TMemoryStrea.Create();  
      Image1.Picture.Bitmap.SaveToStream(MS);
      SetLength(S,MS.Size);
      Move(MS.Memory^,Pointer(S)^,MS.Size)
      MS.Free(); 
      V := StringToVariantArray(S);
      
      conn.Appserver.InputPho(V);
    end;
      

  5.   

    写一个dcom,用流传输,比较简单!
      

  6.   

    to:lwm8246(lwm8246) 
    谢谢!等我测试一下!
      

  7.   

    to:lwm8246(lwm8246) 
    StringToVariantArray(S); 函数在哪儿定义的?好像不在Variants中
      

  8.   

    现在可以传了, 但是图片大小有限制,是不是VarArray 限制了元素个数?
    还有:请问怎么给分?我找不到地方!
      

  9.   

    其实还可以用IPicture来进行传输,用SetOlePicture
    和GetOlePicture方法进行
      

  10.   

    大小有限制吗?
    如果愿意用BLOB字段直接传,很大的都没有问题,我试的时候把一个28M的.PDF文件传过去了。图片也一样。
      

  11.   

    to:qiubolecn
    IPicture 类型在哪里定义?
      

  12.   


      
    做过一个这样的例子.步骤如下:
    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;
     
    该程序在win2000/oracle/三层结构条件下测试过