方法返回Dataset,然后讓clientdataset顯示。有點小問題


用datasnap寫了一個方法,返回一個Tdataset對象: 
function GetDataSet(ASQL: string): TDataSet;

客戶端上放了一個datasetprovider,clientdateset。 現有一個tabcontrol,切換一次取一次數據。

procedure Tfrm_Dictionary.cxTabControl1Change(Sender: TObject);

  procedure GetDataSet(ASQL: string);
  var
    ServerMethod: TServerMethodsClient;
  begin
    ServerMethod := TServerMethodsClient.Create(CM.RestCon);
    try

      dsp1.DataSet :=  ServerMethod.GetDataSet(ASQL);;
      cds1.Close;
      cds1.Open;
      Self.Caption := cds1.RecordCount.ToString();
    finally
      ServerMethod.Free;
    end;
  end;

begin
  case cxTabControl1.TabIndex of
    0:
      GetDataSet
        ('Select * From dicDictionary Where GroupCode = ''CustomerClass'' Or GroupCode = ''SupplierClass''');
    1:
      GetDataSet
        ('Select * From dicDictionary Where GroupCode = ''ProductClass'' Or GroupCode = ''MeasurementUnit''');
    2:
      GetDataSet('Select * From dicDictionary Where GroupCode = ''Area''');
  end;
end;

現在的問題是只有第一次取回的數據,正確。但之后每次取回數據,都比實際的條數少一條,比如語句是4條記錄,但cds里只有3條。是不是取完一次記錄后需要初始化一下,才能再取下一個數據集??請問這個問題如何解決??

8 个解决方案

#1


服務端的代碼是怎么寫的,sql語句暫時別換,全部執行一條sql語句看看

#2


你是用什么版本的,現在的版本不建議客戶端用datasetprovider,用DSProviderConnection

#3


引用 2 樓 jankercsdn 的回復:
你是用什么版本的,現在的版本不建議客戶端用datasetprovider,用DSProviderConnection


這位大大,我用的就是DSProviderConnection,用這個調用datasnap上的方法的,但返回的dataset。
請問 現在不用datasetprovider了,應該怎么返回數據集?
其實我想用olevariant直接賦值clientdateset的data,但我發現服務器一有參數類型寫成olevariant,客戶端獲取不到這個方法。

#4


可以返回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;

#5


我也遇到這個問題,就第一次返回的是正確的,之后的,有時候會少一條,有時候又會少更多。搞不清楚怎么回事,難道是bug? 我是用dsrestconnection

#6


在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也不行,一下少兩條了變成。呵呵。有沒有大神知道原因啊。樓上的實現方法,好像有點太復雜了。

#7


學習datasnap中...

#8


先別管cds,直接查返回的dataset中有幾條數據。
dataset:Tdataset;
begin
   dataset := 你的服務端返回的dataset;
   看一下這個dataset中有幾條,如果還是每次都少一條,你去檢查服務端吧。
end;

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com