DATASNAP对象的释放

看那山瞧那水 2015-01-10 10:31:22
服务端方法:
function TdssmServerMethods.GetDataR(const ASQLStr: string): TDBXReader;
var
aDBXCommand:TDBXCommand;
begin
Result:=nil;
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
//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;

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

end;
Result:=True;
end;
except //这里不能用finally
dr.Free;
end;
end;

这里的dr不能强制释放,如果这样:
finally
dr.Free;
程序运行中不会出错,但是退出时,在Debug下,提示对象释放错误,当然脱离IDE运行不会提示错误

不强制释放:
except
dr.Free;
就没有这个问题,这是哪里出问题了?
...全文
143 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
看那山瞧那水 2015-01-13
  • 打赏
  • 举报
回复
引用 3 楼 lyhoo163 的回复:
DateSnap服务器由引导生成,释放代码也配套生成。
是的,我是用用向导生成的,实际上我的客户端模块也是向导生成的,默认就是AInstanceOwner:=True
看那山瞧那水 2015-01-13
  • 打赏
  • 举报
回复
引用 2 楼 jjwwang 的回复:
另外建议在服务端 TdssmServerMethods.create方法中建立DBXCommand; TdssmServerMethods.Destroy中释放DBXCommand; 至少能少写几行代码。
这个DBXCommand不能独立创建,只能是通过DBXConnect.CreateCommand来返回实例
看那山瞧那水 2015-01-13
  • 打赏
  • 举报
回复
引用 1 楼 jjwwang 的回复:
正常情况下,客户端的dr肯定是可以释放的。 TServerMethodsClient有两个Create; constructor Create(ADBXConnection: TDBXConnection); overload; constructor Create(ADBXConnection: TDBXConnection; AInstanceOwner: Boolean); overload; 你调用第二个,把AInstanceOwner设为false试试。
应当是这个原因,设为False就不提示错误了,难道是二次释放了?
CACACACACA 2015-01-11
  • 打赏
  • 举报
回复
另外建议在服务端 TdssmServerMethods.create方法中建立DBXCommand; TdssmServerMethods.Destroy中释放DBXCommand; 至少能少写几行代码。
CACACACACA 2015-01-11
  • 打赏
  • 举报
回复
正常情况下,客户端的dr肯定是可以释放的。 TServerMethodsClient有两个Create; constructor Create(ADBXConnection: TDBXConnection); overload; constructor Create(ADBXConnection: TDBXConnection; AInstanceOwner: Boolean); overload; 你调用第二个,把AInstanceOwner设为false试试。
lyhoo163 2015-01-11
  • 打赏
  • 举报
回复
DateSnap服务器由于生命期的不同,控件释放代码也不同。
lyhoo163 2015-01-11
  • 打赏
  • 举报
回复
DateSnap服务器由引导生成,释放代码也配套生成。

1,593

社区成员

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

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