在程序运行中如何关闭表,然后用emptytable,而不出现"table is busy"错误?(100分)

  • 主题发起人 主题发起人 pcw
  • 开始时间 开始时间
table1是你原来的,你再放一个query上去,或者动态生成一个:

table1.close;
with query1 do
begin
close;
sql.add('delete from XXX'); //xxx为你要清空的表名字
databasename:=AAA; //database 的 alias
execsql;
end;
 
table1.close;
table1.emptytable;
table1.open;
 
使用TABLE.CLOSE即可,要注意将所有打开此数据库的表都必须关闭,才可以使用EMPTYTABLE
 
Lss is right.u must close all link about this dateset.you can
use first.delete.next to finish it.:<
 
呵呵,用我的方法就可以不管table有没有打开了 :-)
 
虽然记录被删除了,但表(如gab.db为50mb)的大小并不改变(变小)
何因?
 
u have to pack it.i don't know how to do.maybe use DBI....(BDEAPI)
 
用delete,或sql删除,表大小可能不会改变,用empty应该可以使库变小
 
在database desktop上empty当然可以变小,但现在不是在database desktop上!
程序在运行过程中能关闭所有数据表,并emptytable?
 
该问题本人的解决办法:
With <数据库表名> Do
try
Open;
Active := True; {*这很重要*}
First;
if Not isEmpty Then
While Not Eof Do Delete;
Finally
Close;
End;
End;
即可将数据库清空, 本人的试题库中就采用该方法;估计笨了点。:-]
 
用sql比直接对表操作安全
delete后用pack就可以了
 
详细用法: 设好TABLE1的属性, 包括TALBENAME, DATABASE NAME等。 特别注意
的是TABLE1.EXCLUSIVE应为'TRUE'
这样才能对TABLE进行PACK TABLE.
DBIPACKTABLE(TABLE1.DBHANDLE,TABLE1.HANDLE,NIL,NIL,TRUE); 即可PACK TABLE.

另, 若在DELPHI IDE中, TABLE1的ACTIVE应为FALSE; 在FORM的ONCREATE中执行
TABLE1.ACTIVE:=TRUE
来打开数据库, 否则在执行程序是会提示TABLE IS BUSY. 原因是在IDE中已经打
开的TABLE, 无法的独占地打开TABLE.
 
使表独占即可,注意把KEEPCONNECT -- FALSE
 
多人接受答案了。
 
后退
顶部