delphi xe2 的datasnap 的TDataSet参数的问题

trainbox 2012-07-14 10:55:14
delphi xe2 的datasnap

socket服务端定义了如下方法

function CreateFunc(AParamDataSet: TDataSet): string;

客户端自动生成了如下方法调用

function TServerMethodsClient.CreateFunc(AParamDataSet: TDataSet): string;
begin
if FCreateProcedureProviderCommand = nil then
begin
FCreateProcedureProviderCommand := FDBXConnection.CreateCommand;
FCreateProcedureProviderCommand.CommandType := TDBXCommandTypes.DSServerMethod;
FCreateProcedureProviderCommand.Text := 'TServerMethods.CreateFunc';
FCreateProcedureProviderCommand.Prepare;
end;
FCreateProcedureProviderCommand.Parameters[0].Value.SetDBXReader(TDBXDataSetReader.Create(AParamDataSet, FInstanceOwner), True);
FCreateProcedureProviderCommand.ExecuteUpdate;
Result := FCreateProcedureProviderCommand.Parameters[1].Value.GetWideString;
end;

使用的过程中发现,客户端这个方法第一次执行就正常,第二次执行就报内存错误

---------------------------
Debugger Exception Notification
---------------------------
Project PlanEdit.exe raised exception class $C0000005 with message 'access violation at 0x00591fbe: read of address 0x0000000c'.
---------------------------
Break Continue Help
---------------------------

各位大虾遇到过这种情况不?
...全文
378 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
trainbox 2012-07-18
  • 打赏
  • 举报
回复
tony回答是正确的,问题已解决,结贴
tony_4444 2012-07-17
  • 打赏
  • 举报
回复
你使用了
FCreateProcedureProviderCommand.Parameters[0].Value.SetDBXReader(TDBXDataSetReader.Create(AParamDataSet, FInstanceOwner), True);
这个最后一个参数是True的意思,是释放TServerMethodsClient对象的时候DataSet也被释放了,这肯定不是你希望的.一般来说,DataSet在DataModule上面。反复要用的。
把那个True,变成False,就行了。就是不要让TServerMethodsClient拥有OwnerInstance。这样
它就不会自动释放DataSet了。或者用另外的带有选择OwnerInstance参数的创建方法,设置OwnerInstance为False
kaikai_kk 2012-07-14
  • 打赏
  • 举报
回复
第一次执行结束了,是不是把FCreateProcedureProviderCommand释放了,但不是nil
所以if FCreateProcedureProviderCommand = nil then并不成立,而直接执行后面的代码了

用FreeAndNil试试

1,593

社区成员

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

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