DataSnap返回数据集的方法的奇怪问题

看那山瞧那水 2014-12-22 10:57:00
一个服务器方法:
function TdssmServerMethods.GetDataR(const ASQLStr: string): TDBXReader;
var
aDBXCommand:TDBXCommand;
begin
if not sqlconMethods.Connected then
sqlconMethods.Open;
aDBXCommand:=sqlconMethods.DBXConnection.CreateCommand;
try
aDBXCommand.Text:=ASQLStr;
aDBXCommand.CommandType:=TDBXCommandTypes.DbxSQL; //'Dbx.SQL'
Result:=aDBXCommand.ExecuteQuery;
except
//
end;
end;

这个方法运行很奇怪啊,程序中如果第一次调用(连续执行几次不同ASQLStr的调用),能成功执行.
然后在后面(其它窗口),再执行这个方法时,就提示错误了,
客户端调用在FGetDataRCommand.ExecuteUpdate;这里出错,访问了无效指针.
win7系统, delphi xe6, 服务器配置为session

其它返回JSON类的方法不会出错.

xe2的DEMO有个类似方法:
function TdssmServerMethods.GetDataR(const ASQLStr: string): TDBXReader;
var
aDBXCommand:TDBXCommand;
aReader:TDBXReader;
aCDS:TClientDataSet;
begin
sqlconMethods.Open; //这是一个固定连接
aDBXCommand:=sqlconMethods.DBXConnection.CreateCommand;
try
aDBXCommand.Text:=ASQLStr;
aDBXCommand.CommandType:=TDBXCommandTypes.DbxSQL; //'Dbx.SQL'

aReader:=aDBXCommand.ExecuteQuery;
aCDS:=TDBXClientDataSetReader.ToClientDataSet(nil,aReader,True);
aCDS.Open;
Result:=TDBXClientDataSetReader.Create(aCDS,False);
finally
aDBXCommand.Free;
end;
end;

也一样出错类似的问题.

客户端调用方法:

function GetSelectItemParamList(SelectItemParamList:TSelectItemParamList):Boolean;
var
aName:string;
aSelParam:TSelectItemParam;
aSQL:string;
dr:TDBXReader;
begin
Result:=False;
aSQL:='SELECT * FROM TheSelectItems';
dr:=pClientServerMethods.GetDataR(aSQL);
try
if dr <> nil then
begin
while dr.Next do
begin
aName:=dr['SelectItemName'].AsString;
aSelParam.BankCode:=dr['BankCode'].AsString;
aSelParam.TableName:=dr['SelectItemTableName'].AsString;
aSelParam.CanEdit:=dr['CanEdit'].AsBoolean;
//SelectItemParamList.Add(aName,aSelParam);

if (aName <> '') and (aSelParam.TableName <> '') and (not SelectItemParamList.ContainsKey(aName)) then
begin
SelectItemParamList.Add(aName,aSelParam);
end;

end;
Result:=True;
end;
finally
dr.Free;
end;
end;

这里的dr按要求马上释放了

纠结啊
...全文
326 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyhoo163 2014-12-24
  • 打赏
  • 举报
回复
解决了就好,自己的代码,自我完善,是最美的。
看那山瞧那水 2014-12-23
  • 打赏
  • 举报
回复
总算解决了问题,是自己想当然了 我在程序初始化时,这样写: Application.CreateForm(TfrmClientMain, frmClientMain); Application.CreateForm(TdmClientModule, dmClientModule); //ProcSystemInit; //千万别在这里调用服务端方法!!! Application.Run; ProcSystemInit里调用了一些存放在数据库里的配置参数,调用了GetDataR(),这里调用本身没错,但是,程序运行后,如果再次调用这个GetDataR(),执行到FGetDataRCommand.ExecuteUpdate时就发生错误........ 纠结的是另一台win8电脑上没有这个问题........... 最后偶然试下,在frmClientMain的Show事件里调用,OK了,虽然还没搞明白为什么
看那山瞧那水 2014-12-23
  • 打赏
  • 举报
回复
引用 2 楼 jjwandjy 的回复:
这个方法运行很奇怪啊,程序中如果第一次调用(连续执行几次不同ASQLStr的调用),能成功执行. 然后在后面(其它窗口),再执行这个方法时,就提示错误了, //---------------------------------------------------------------------------------------------- 如果不是多线程用一个连接的话,应该没问题。 另外,客户端代码有问题: try if dr <> nil then begin end; finally //dr=nil 的,也dr.free?? dr.Free; end;
关于这个释放的问题,也纠结了好久,上次就发过一个贴了.服务端方法如果返回DBXReader的,DBXCommand不能释放,不管是用TComponent,还是TDataModule,还是TDSServerModule,释放了就错. 客户端的DBXReader也不能释放,如果释放了,当客户端退出程序时,就会造成FreeInstance错误.
晃晃悠悠 2014-12-23
  • 打赏
  • 举报
回复
另外, server方法 的 dbxcommand没有释放!
晃晃悠悠 2014-12-23
  • 打赏
  • 举报
回复
这个方法运行很奇怪啊,程序中如果第一次调用(连续执行几次不同ASQLStr的调用),能成功执行. 然后在后面(其它窗口),再执行这个方法时,就提示错误了, //---------------------------------------------------------------------------------------------- 如果不是多线程用一个连接的话,应该没问题。 另外,客户端代码有问题: try if dr <> nil then begin end; finally //dr=nil 的,也dr.free?? dr.Free; end;

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧