三层应用,
服务器:有一个方法
procedure Tlisten.sql(var sql: OleVariant; out record_: OleVariant);
begin
   adoquery1.Close;
   adoquery1.SQL.Clear;
   adoquery1.SQL.Add(sql);
   adoquery1.Open;
   record_:=adoquery1.Recordset;
except on exception do begin sql:='error on server' end
end;
end;
客户端
var sql,re:olevariant;
sql:=edit3.Text;
socketconnection1.AppServer.sql(sql,re);
adodataset1.Recordset:=Iunknown(re) as _Recordset;为什么运行总说oleaut32.dll访问内存错误????
用clientdataset.commandtext就没有问题,
调用不返回数据集合的服务器方法也正常.
用单独程序直接连数据库,使用上述语句也可以
在ASP下调用返回数据集的方法也行!!!
为什么啊????救救我吧.......................

解决方案 »

  1.   

    苹果每次都是创建远程对象的指针再调用接口函数的。test:IListen;test := CoCreateRemote(机器名);
    test.sql(sql,re);
      

  2.   

    _Recordset是个接口吗?在服务器的方法中是不是应该定义成Tlisten.sql(var sql: OleVariant):Iunknown的形式。
    要么直接返回一个OleVariant形的数组?
    我觉得出错的关键是把OleVariant转换成结口后出的错。
      

  3.   

    //应该定义成这个形式:
    function Tlisten.sql(var sql: OleVariant);OleVariant
    ...
     Result:=adoquery1.Recordset;
    ...
      

  4.   

    socketconnection1.AppServer.sql(sql,re); 这句要socketconnection1.AppServer.sql(WideString(sql),re);那个 sql 也可以定义成 widestring
      

  5.   

    那样可能会被当作 AnsiString 发送
      

  6.   

    为什么不试试:
    ClientDataSet1.Data:=ClientDataSet1.DataRequest;
    然后,写与ClientDataSet1相关连的TDataSetProvider控件的OnDataRequest事件中代码:
    function TMoLongData.DataSetProvider1DataRequest(Sender: TObject;
      Input: OleVariant): OleVariant;
    begin
    With ADOQuery1 do
    begin
      Close;
      SQL.Add('Select * From TableName');
      Open;
    end;
    Result:=DataSetProvider1.Data;
    end;
      

  7.   

    注:ADOQuery1与DataSetProvider1相连
      

  8.   

    吐血感谢 star_of_light(星星之光) 
    虽然你没有正面回答我的问题,但是你的方法给了我解决这个问题的提示!!!
    真的很感谢你!!!
    有空用MSN多联系呀[email protected]
      

  9.   

    这么简单的问题还没解决?
    真的要吐血了?ado的RECORDSET是OLEVARIANT,
    但不能返回到客户的CLIENTDATSET呀,都没有瞧清原型,
    反正都是OLEVARIANT,就去RESULT,那有这样的事呀.
    简直就是张冠李戴了,真的要吐血了.
    Procedure CopyData(sourceDa:TDataset;destDa:Tclientdataset);
    var i:integer;
    begin
      if not SourceDa.active Then exit;
      if not createda(sourceda,Destda) then exit;
      sourceDa.First;
      while not sourceDa.eof do begin
        DestDa.Append;
        for i:=0 to SourceDa.fieldcount-1 do begin
        Destda.fields[i].value:=sourceDa.fields[i].value;
        end;
        DestDa.post;
        sourceDa.next;
      end;
    end;Function getdata(sqlstr:string):olevariant;
    begin
    adoq1.close;
    adoq1.sql.text:=sqlstr;
    adoq1.open;
    copydata(adoq1,clientdatasettmp);//clientdatasettmp是一个临时用的clientdataset控件
    result:=clientdataset1.data;
    end;client直接CLIENTDATASET.data:=getdata即OK;