方法返回Dataset,然后让clientdataset显示。有点小问题 服务端的代码是怎么写的,sql语句暂时别换,全部执行一条sql语句看看 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你是用什么版本的,现在的版本不建议客户端用datasetprovider,用DSProviderConnection 这位大大,我用的就是DSProviderConnection,用这个调用datasnap上的方法的,但返回的dataset。请问 现在不用datasetprovider了,应该怎么返回数据集?其实我想用olevariant直接赋值clientdateset的data,但我发现服务器一有参数类型写成olevariant,客户端获取不到这个方法。 可以返回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; 我也遇到这个问题,就第一次返回的是正确的,之后的,有时候会少一条,有时候又会少更多。搞不清楚怎么回事,难道是bug?我是用dsrestconnection 在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也不行,一下少两条了变成。呵呵。有没有大神知道原因啊。楼上的实现方法,好像有点太复杂了。 先别管cds,直接查返回的dataset中有几条数据。dataset:Tdataset;begin dataset := 你的服务端返回的dataset; 看一下这个dataset中有几条,如果还是每次都少一条,你去检查服务端吧。end; TMainMenu如果修改背景色 求dxDBGrid的使用说明文件 dxDBTreeView 显示的问题 散分 郁闷,这几天好像贴子有问题,经常飞贴 FastReport如何将两个报表的内容顺序打出,不换页? 关于使用compute实行分类统计的问题 怎么用DELPHI实现企业对象啊 如何使delphi自带的打包程序支持中文? 我是新手,请大家指点一二 学Delphi也不容易啊?谁知道昆明哪里有培训Delphi的? 求解报错“终结点映射器中没有更多的终结点可用” 求教 xe5 颜色赋值的问题
这位大大,我用的就是DSProviderConnection,用这个调用datasnap上的方法的,但返回的dataset。
请问 现在不用datasetprovider了,应该怎么返回数据集?
其实我想用olevariant直接赋值clientdateset的data,但我发现服务器一有参数类型写成olevariant,客户端获取不到这个方法。
参考网络上的一些实现方法服务端:
返回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;
Client := TServerMethods1Client.Create(ClientModule10.DSRESTConnection1);这样连接用 datasetprovider2.DataSet:=返回数据库;
datasetprovider2.DataSet.Refresh;
clientdataset2.Refresh;服务模块用fdquery,刷新了,数据不但不更新,加上新数据,还减少一行。但是用fdtable,显示就没问题。但是clientdataset.rowcount 数字还是没增加。想不明白啊。虽然用fdtable也一样,但是不明白是什么原因导致的。查了很多资料也没整明白,似乎问题出在dataset返回到datasetprovider,会有一个去索引的过程?,我的fdquery有个排序语句。导致后面的clientdataset错乱了?有大神,跟解决下不,要不然程序虽然能用,心里不踏实............................................................................................................最近又发现了用fdtable也不行,一下少两条了变成。呵呵。有没有大神知道原因啊。楼上的实现方法,好像有点太复杂了。
dataset:Tdataset;
begin
dataset := 你的服务端返回的dataset;
看一下这个dataset中有几条,如果还是每次都少一条,你去检查服务端吧。
end;