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   
---------------------------各位大虾遇到过这种情况不?

解决方案 »

  1.   

    第一次执行结束了,是不是把FCreateProcedureProviderCommand释放了,但不是nil
    所以if FCreateProcedureProviderCommand = nil then并不成立,而直接执行后面的代码了用FreeAndNil试试
      

  2.   

    你使用了
     FCreateProcedureProviderCommand.Parameters[0].Value.SetDBXReader(TDBXDataSetReader.Create(AParamDataSet, FInstanceOwner), True);
    这个最后一个参数是True的意思,是释放TServerMethodsClient对象的时候DataSet也被释放了,这肯定不是你希望的.一般来说,DataSet在DataModule上面。反复要用的。
    把那个True,变成False,就行了。就是不要让TServerMethodsClient拥有OwnerInstance。这样
    它就不会自动释放DataSet了。或者用另外的带有选择OwnerInstance参数的创建方法,设置OwnerInstance为False
      

  3.   

    tony回答是正确的,问题已解决,结贴