初学者的数据库问题求教!请高手指教,不胜感激!(50分)

  • 主题发起人 abigfrog
  • 开始时间
A

abigfrog

Unregistered / Unconfirmed
GUEST, unregistred user!
strSQL:='select max(id) as maxId from tree';
query.Close;
query.SQL.Clear;
query.SQL.Text:=strSQL;
query.open;
maxId:=query.fieldbyname('maxId').asinteger;
query.First;
query.SQL.Free;
query.Close;
这段代码有错么?为什么总导致程序在退出时报错?注释掉上面代码就没有问题。请高手
指教,不胜感激!
 
query.First;
query.SQL.Free;

多余的两句。
 
建议逐句注释掉代码,找到出错的地方。
保守的写法是:
strSQL:='select id from tree order by id';
query.Close;
query.SQL.Clear;
query.SQL.Text:=strSQL;
query.open;
query.Last;
maxId:=query[id];
query.Close;


 
改成这样如何?
strSQL:='select max(id) as maxId from tree';
query.Close;
query.SQL.Clear;
query1.SQL.Add(strSQL);//改一下
query.open;
maxId:=query.fieldbyname('maxId').asinteger;
query.Close;
 
query.SQL.Free;什么时候用?
 
有谁用过dxDBTreelist?
 
感谢 Nizvoo
去掉后不报错了!可是是什么原因呢?能否麻烦告知?
 
晚安,朋友,明天见!
 
[:)]同意Nizvoo
 
大伙能否解释一下原因?
 
Query1.SQL是一个TStrings类型的对象,是由Query1自身来完成对它的内存分配和资源释放的,
如果你用了Query1.SQL.Free,那Query1自身在需要访问SQL的时候就会出错,所以Query1.SQL.Free不能要,
如果你想把Query1.SQL清空的话可以用Query1.SQL.Clear;

至于query.First;这是一句多余的语句,你后面不需要访问Query中的数据了,它的记录指针在什么位置已经不重要,
所以不需要这句(但是你不去掉这句也不会报错).
 
谢谢各位!散分!
 
to abigfrog:

问题主要在 query.sql.free; 这一条语句。
这是因为:
query是一个类(Tquery)类型的对象。它是在窗体创建的时候
自动由窗体创建的,同样,也会在窗体注销的时候自动释放(Free),
现在query.sql是一个Tstrings类型的对象,它已经由窗体对象创建,
你现在手动销毁它。但在窗体释放的时候,窗体还会调用query.free
去释放query,而query有很多成员是对象,窗体form会逐个释放,再次释放一个
一个已经释放的对象,就会产生你所说的错误。
 
顶部