舍命求解:WHY table is busy?(100分) (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'的可能原因有哪些?应在程序中如何避免?
/////////为题回答满意者小弟高分相赠!谢谢各位大虾!///////////////


 
你可以试试在删除前先关闭query,再打开删除!即先query.close 一下。
 
统一楼上的观点,可能是这样的原因,.
一般说来:如果某个表正在使用不能进行更改其结构的操作,包括删除
 
第一,创建、删除、插入、修改表结构等操作都要用TQuery.ExecSQL来执行而不是Open。
第二,一定还有某个数据集控件在打开该表,才会出现这个错误。这一点不用怀疑,只需
认真检察。一般来说在你的程序出现数据引擎错误的时候,有时数据表会被锁定,这是正
常的,只需要关闭Delphi和其它各个数据工具(如Database Desktop、SQL Explorer)都
关闭再重新启动Delphi,数据表的锁定就会被解除。
你可以用下面这段程序试验一下:

//源文件
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Grids, DBGrids, Db, DBTables;

type
TForm1 = class(TForm)
Query1: TQuery;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Button1: TButton;
Memo1: TMemo;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
begin
if (Memo1.Text<>'') then
begin
Query1.Close;
Query1.SQL.Text := Memo1.Text;
if (RadioButton1.Checked) then
Query1.ExecSQL
else if (RadioButton2.Checked) then
Query1.Open;
end;
end;

end.

//窗体
object Form1: TForm1
Left = 192
Top = 107
Width = 544
Height = 375
Caption = 'Form1'
Color = clBtnFace
Font.Charset = GB2312_CHARSET
Font.Color = clWindowText
Font.Height = -12
Font.Name = '宋体'
Font.Style = []
OldCreateOrder = False
PixelsPerInch = 96
TextHeight = 12
object Label1: TLabel
Left = 8
Top = 200
Width = 60
Height = 12
Caption = '&Input SQL:'
FocusControl = Memo1
end
object DBGrid1: TDBGrid
Left = 8
Top = 8
Width = 521
Height = 185
DataSource = DataSource1
TabOrder = 0
TitleFont.Charset = GB2312_CHARSET
TitleFont.Color = clWindowText
TitleFont.Height = -12
TitleFont.Name = '宋体'
TitleFont.Style = []
end
object Button1: TButton
Left = 408
Top = 272
Width = 75
Height = 25
Caption = '&Do it'
TabOrder = 1
OnClick = Button1Click
end
object Memo1: TMemo
Left = 8
Top = 224
Width = 337
Height = 89
TabOrder = 2
end
object RadioButton1: TRadioButton
Left = 408
Top = 216
Width = 97
Height = 17
Caption = '&ExecSQL'
Checked = True
TabOrder = 3
TabStop = True
end
object RadioButton2: TRadioButton
Left = 408
Top = 240
Width = 97
Height = 17
Caption = '&Open'
TabOrder = 4
end
object Query1: TQuery
DatabaseName = 'DBDEMOS'
Left = 8
Top = 8
end
object DataSource1: TDataSource
DataSet = Query1
Left = 8
Top = 40
end
end
 
我以前也碰到过这种情况肯定是Sachow说的原因
 
同意上面的话还有就是加query.prepare before query open, excute,
和Application.processmessage after query open, excute.
 
关闭delphi然后重新启动delphi,有时候这是一个bug引起的。
 
同意Sachow的说法,大家都说的差不多了,我已无话可说。
 
我遇到过类似的事,原因是程序运行时未关闭Database Desktop Tool窗口。
 
多人接受答案了。
 
后退
顶部