两个问题请教诸位??(200)(200分)

5

52free

Unregistered / Unconfirmed
GUEST, unregistred user!
1、如果对一个query控件的sql语句prepared:=ture以后,没有prepared:=false就Free了query
会不会造成服务器端资源得不到释放?

2、昨天看到一位仁兄在dwf上论道动态创建的对象如果有parent的话
释放时需parent:=nil才不会造成内存泄漏
有必要这样做吗我用一些内存监测工具并没有发现这个问题

以上两点请大家踊跃发言,言者有分
 
1.没有研究.
2.他说错了.
 
第一个问题:我一般都不用prepare;没什么了解.
对第二个问题:
根据我的理解,释放时这样做没有道理.要释放某个对象,释放本身,最多再释放其子控件
没道理释放Parent.
 
1、不会。
其实在open前系统默认调用prepared :=false;close时调用prepared :=true;
2、parent ;=nil 后assgined()机返回false;否则 返回true 仍然 认为存在内存中。
 
同意:sunsong
 
1,系统会启动释放资源的,其实如果你不显示写prepared,Delphi也会自动替你写的。
显示写prepared只用在多次执行sql语句的情况下会提高效率。
2,如果他的parent还在,执行parent=nil岂不糟糕。而且parent=nil只是将一个指针
赋为空,与它关联的内存没有关系。
 
bluebridge
第二点指的是这个对象的parent属性=nil
而不是这个对象的拥有者=nil(这是两个概念啊:p)
再问一下如果一个动态创建的query用完后free前不写这么一句(FQuery.Connection:=nil)
那么sqlserver会不会释放它连接的资源
 
再问一下如果一个动态创建的query用完后free前不写这么一句(FQuery.Connection:=nil)
那么sqlserver会不会释放它连接的资源

请大家再讨论一下,搞明白后就放分
 
1,那個PREPARED一般而言沒什麼用,設為TRURE後,不必改回來,服務器自己會處理這個事的
2,動態創建的對象和在設計期設計的東西沒有什麼不同,所以將PARENT設為NIL再釋放是沒有根據的。如果內存要泄漏,那是因為他創建的對象的釋放本身有問題!
 
1、第一个问题,正常操作就可以了。
2、第二个问题,一般来说,只能自己操作自身及其下属。
 
1.Prepare()后必须调用一次UnPrepare释放资源,见Delphi5开发指南P1037页
query1.Prepare;
try
try
...
finally
query1.close;
end;
finally
query1.Unprepare;
end;
2.没有必要
 
第一个问题,其实说你可以用也可以不用。
一般速度也看不出来。不过养成close之前先prepared:=false;open之前ture是个好习惯。
with AdoQuery1 do
begin
Prepared := false;
Close;
SQL.Clear;
SQL.Add('SELECT * FROM table1');
if not(prepared) then prepared;
Open;
end;;
第二个问题,没有仔细研究过。暂时不能回答你~~
 
多人接受答案了。
 
顶部