服务端的代码是怎么写的,sql语句暂时别换,全部执行一条sql语句看看

解决方案 »

  1.   

    你是用什么版本的,现在的版本不建议客户端用datasetprovider,用DSProviderConnection
      

  2.   


    这位大大,我用的就是DSProviderConnection,用这个调用datasnap上的方法的,但返回的dataset。
    请问 现在不用datasetprovider了,应该怎么返回数据集?
    其实我想用olevariant直接赋值clientdateset的data,但我发现服务器一有参数类型写成olevariant,客户端获取不到这个方法。
      

  3.   

    可以返回TDataset,不过客户端一般是用ClientDataset,还不如直接返回DatasetReader
    参考网络上的一些实现方法服务端:
    返回DataSet:
    function TdssmServerMethods.GetDataD(const ASQLStr: string): TDataSet;
    var
      ads:TSQLDataSet;
    begin
      ads:=TSQLDataSet.Create(Self);
      ads.SQLConnection:=sqlcon1;
      ads.CommandText:=ASQLStr;
      ads.Open;
      Result:=ads;
    end;
    返回Json:function TdssmServerMethods.GetDataJ(const ASQLStr: string): TJSONObject;
    var
      acmd:TDBXCommand;
      ard:TDBXReader;
    begin
      Result:=nil;
      acmd:=sqlcon1.DBXConnection.CreateCommand;
      try
        acmd.Text:=ASQLStr;
        ard:=acmd.ExecuteQuery;
        Result:=TDBXJSONTools.TableToJSON(ard,100,True);
      finally
        acmd.Free;
      end;
    end;返回DataSetReader:
    function TdssmServerMethods.GetDataR(const ASQLStr: string): TDBXReader;
    var
      acmd:TDBXCommand;
      //ard:TDBXReader;
    begin
      Result:=nil;
      acmd:=sqlcon1.DBXConnection.CreateCommand;
      acmd.Text:=ASQLStr;
      Result:=acmd.ExecuteQuery;end;
    客户端:procedure TdmClientModule.GetDataFromDataSet(const ASQLStr: string; ADataSet: TClientDataSet);
    var
      ad:TDataSet;
      aps:TDataSetProvider;
    begin
      if ADataSet.Active then
      begin
        ADataSet.Close;
        ADataSet.FieldDefs.Clear;
        ADataSet.Fields.Clear;
        ADataSet.IndexDefs.Clear;
      end;
      ad:=GetdssmServerMethodsClient.GetDataDD(ASQLStr);
      aps:=TProvider.Create(Self);
      aps.DataSet:=ad;
      ADataSet.SetProvider(aps);
      ADataSet.Open;
    end;function TdmClientModule.GetDataFromJSON(const ASQLStr: string):string;
    begin
      Result:=GetdssmServerMethodsClient.GetDataJ(ASQLStr).ToString;
    end;procedure TdmClientModule.GetDataFromReader(const ASQLStr: string; ADataSet: TClientDataSet);
    var
      ard:TDBXReader;
    begin
      if ADataSet.Active then
      begin
        ADataSet.Close;
        ADataSet.FieldDefs.Clear;
        ADataSet.Fields.Clear;
        ADataSet.IndexDefs.Clear;
      end;
      ard:=GetdssmServerMethodsClient.GetDataR(ASQLStr);
      TDBXClientDataSetReader.CopyReaderToClientDataSet(ard,ADataSet);
      ADataSet.Open;
    end;
      

  4.   

    我也遇到这个问题,就第一次返回的是正确的,之后的,有时候会少一条,有时候又会少更多。搞不清楚怎么回事,难道是bug?我是用dsrestconnection
      

  5.   

    在TServerMethods1 里面的调用函数里面用fdquery查询 得到的dataset返回给客户端,客户端用datasetprovider,clientdataset,接收。
    Client := TServerMethods1Client.Create(ClientModule10.DSRESTConnection1);这样连接用 datasetprovider2.DataSet:=返回数据库;
       datasetprovider2.DataSet.Refresh;
      clientdataset2.Refresh;服务模块用fdquery,刷新了,数据不但不更新,加上新数据,还减少一行。但是用fdtable,显示就没问题。但是clientdataset.rowcount  数字还是没增加。想不明白啊。虽然用fdtable也一样,但是不明白是什么原因导致的。查了很多资料也没整明白,似乎问题出在dataset返回到datasetprovider,会有一个去索引的过程?,我的fdquery有个排序语句。导致后面的clientdataset错乱了?有大神,跟解决下不,要不然程序虽然能用,心里不踏实............................................................................................................最近又发现了用fdtable也不行,一下少两条了变成。呵呵。有没有大神知道原因啊。楼上的实现方法,好像有点太复杂了。
      

  6.   

    先别管cds,直接查返回的dataset中有几条数据。
    dataset:Tdataset;
    begin
       dataset := 你的服务端返回的dataset;
       看一下这个dataset中有几条,如果还是每次都少一条,你去检查服务端吧。
    end;