查询出来的记录大概有四万
应用程序服务器端:
function Tguangxin.sel_kck(const sql: WideString): OleVariant;
var
  str:string;
begin
  str:=sql;
  adodataset1.CommandText:=str;
  adodataset1.Open;
  DataSetProvider1.DataSet:=adodataset1;
  application.MessageBox('sdf','sdf',0);//对话框在4秒的时候出现
  result:=DataSetProvider1.Data;
end;客户端:
procedure TForm1.Button1Click(Sender: TObject);
begin
  clientdataset1.DisableControls;
  clientdataset1.Data:=socketconnection1.AppServer.sel_kck('select * from kck');
  clientdataset1.EnableControls;//数据在50秒的时候才显示出来
end;

解决方案 »

  1.   

    我把代码改成这样时发现主要是data:=DataSetProvider1.Data;慢,并不是网络传输的速度慢,请问有没有什么方法解决呢?
    function Tguangxin.sel_kck(const sql: WideString): OleVariant;
    var
      str:string;
      data:olevariant;
    begin
      str:=sql;
      adodataset1.CommandText:=str;
      adodataset1.Open;
      DataSetProvider1.DataSet:=adodataset1;
      data:=DataSetProvider1.Data;
      application.MessageBox('sdf','sdf',0);
      result:=data;
    end;
      

  2.   

    我觉得问题在于你用 select * from table 事实上客户端不见得需要这么大的数据量吧 以前看李维的书里有getpacket nextpacket的用法(记不太清了)就是一次取一定量的数据 可以找来看看  
      

  3.   

    服务段查出来的数据不能全部返回到客户端,
    这样做的话就体现不出多层的优势了。
    在客户端的
    ClientDataset.packcount:=20
    比较合适(大小看你的应用)。
      

  4.   

    就是一开始显示20条记录,当你点击DBGrid的滚动条向下走的时候,
    他自动的又从服务段取得下20个数据。
      

  5.   

    不知你为什么这样用,为什么要在服务器端写此过程。为何不在客户端clientdataset直接连接服务器端的datasetprovider,直接修改clientdataset的commandtext就行了。
      

  6.   

    请问楼上提到的commandtext怎么使用呢?为什么我每次修改commandtext然后提交时总是出错呢?
      

  7.   

    就你上面的代码来了来看,肯定是没什么实际用途的。
    谈不上方便,效率也没有ClientDataSet直接连接
    DataSetProvider1来得快。