舍命求解:WHY table is busy?(100分)

  • 主题发起人 主题发起人 delphi_jzy
  • 开始时间 开始时间
D

delphi_jzy

Unregistered / Unconfirmed
GUEST, unregistred user!
<1>我用paradox作库,在程序运行中用button1建表:
query1.sql.add('create table_name..............');
以上为略写,
在button2删除表:
query1.sql.add('drop table............');
在使用删除语句前我已经把与table_name.db关联的query都关闭,
为啥出现:'table is busy'的运行错误?
<2>我用paradox作库,在程序运行中用button1添加表的字段:
query1.sql.add('alter table_name..add ziduan_name...........');
以上为略写,
在button2删除表的字段:
query1.sql.add('alter table....drop...ziduan_name.....');
在使用删除语句前我已经把与table_name.db关联的query都关闭,
为啥出现:'table is busy'的运行错误?
<3>是不是在一个程序运行中无法对表进行结构上的反复操作,如果希望
完成这样的操作,应该怎莫办?
<4>出现'table is busy'的可能原因有哪些?应在程序中如何避免?
/////////为题回答满意者小弟高分相赠!谢谢各位大虾!///////////////

 
应该不是这个原因,你是否是在调试环境下,关掉delphi试试看,
是否是你在开发环境中打开了表,建议在form中把表关闭,然后运行时open.
或者其他form有没有打开表
 
其实我觉得理想点的做法是
如果每次新建表后将数据库连接关闭。
每次删除表重新连接数据库,删除后在关闭连接。
这有点类似我们操作DBF等
 
第一,创建、删除、插入、修改表结构等操作都要用TQuery.ExecSQL来执行而不是Open。
第二,一定还有某个数据集控件在打开该表,才会出现这个错误。这一点不用怀疑,只需
认真检察。一般来说在你的程序出现数据引擎错误的时候,有时数据表会被锁定,这是正
常的,只需要关闭Delphi和其它各个数据工具(如Database Desktop、SQL Explorer)都
关闭再重新启动Delphi,数据表的锁定就会被解除。
 
我记得此类在程序中改变表的结构的运算必须在这个程序结束后才在硬盘中反应出来。因此我想
是不是每一次改变必须有一个确认修改的语句,如同一个事务一样。具体我也不清楚呀,哈哈。
 
解决table is busy最好的方法是将table的exclusive属性设为true,但这是一个霸道的方法
 
为什么用sql.add,每回使用sql.add前,你把sql清空了吗?要不在sql.add前先调用
sql.clear;要不直接使用sql.text:=
local sql应该不支持在一个sql中有多个语句。
 
多人接受答案了。
 
后退
顶部