读书人

delphi xe2 的datasnap 的TDataSet参数

发布时间: 2012-08-09 15:59:21 作者: rapoo

delphi xe2 的datasnap 的TDataSet参数的问题
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
---------------------------

各位大虾遇到过这种情况不?

[解决办法]
第一次执行结束了,是不是把FCreateProcedureProviderCommand释放了,但不是nil
所以if FCreateProcedureProviderCommand = nil then并不成立,而直接执行后面的代码了

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

读书人网 >.NET

热点推荐