一个C++Builder5的InterBase组件问题(200分)(200分)

  • 主题发起人 主题发起人 mingcb
  • 开始时间 开始时间
M

mingcb

Unregistered / Unconfirmed
GUEST, unregistred user!
以下程序的Button1Click在运行第二遍(即按钮的第二次点击)出错:“unsuccessful metadata update
object TMP_TJ is in use”,异常类是:“EIBInterBaseError”,原因何在?
望大侠们帮帮忙!

在Form1中有IBDatabase1.IBTransaction1.IBSQL1.IBTable1.IBDataSet1五个IB组件和一个
Button1按钮组件,InterBase数据库中有两个表:
BM_SP:BH smallint not null primary key,MC varchar(30),DY varchar(6),D1 smallint
TMP_TJ:BH smallint not null primary key,MC varchar(30),DY varchar(6)

Form1的单元程序如下:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Form1->IBTable1->TableName="TMP_TJ";

if (Form1->IBTable1->Exists) {
Form1->IBSQL1->SQL->Clear();
Form1->IBSQL1->SQL->Add("drop table TMP_TJ");
Caption="1111111111111";
Form1->IBSQL1->ExecQuery();
Caption="2222222222222";
Form1->IBTransaction1->CommitRetaining();
}
//----------------------------------
Caption="333333333";
Form1->IBSQL1->SQL->Clear();
Form1->IBSQL1->SQL->Add("create table TMP_TJ (BH smallint /
not null primary key,MC varchar(30),DY varchar(6),/
D1 smallint)");
Form1->IBSQL1->ExecQuery();
Form1->IBTransaction1->CommitRetaining();
Caption="444444444444";
//------------------------------
Form1->IBSQL1->SQL->Clear();
Form1->IBSQL1->SQL->Add("insert into TMP_TJ (BH,MC,DY) /
select BH,MC,DY from BM_SP");
Form1->IBSQL1->ExecQuery();
Caption="555555555555";
//Form1->IBTransaction1->CommitRetaining();
Caption="666666666666";
//----------------------------------
Form1->IBDataSet1->Active=false;
Form1->IBDataSet1->SelectSQL->Clear();
Form1->IBDataSet1->RefreshSQL->Clear();
Form1->IBDataSet1->InsertSQL->Clear();
Form1->IBDataSet1->ModifySQL->Clear();
Form1->IBDataSet1->DeleteSQL->Clear();
Form1->IBDataSet1->SelectSQL->Add("select * from TMP_TJ");
Form1->IBDataSet1->RefreshSQL->Add("select * from TMP_TJ /
where BH=:BH");
Form1->IBDataSet1->InsertSQL->Add("insert into TMP_TJ /
(BH,MC,DY,D1) values(:BH,:MC,:DY,:D1)");
Form1->IBDataSet1->ModifySQL->Add("update TMP_TJ set /
BH=:BH,MC=:MC,DY=:DY,D1=:D1 where BH=:OLD_BH");
Form1->IBDataSet1->DeleteSQL->Add("delete from TMP_TJ /
where BH=:OLD_BH");
Form1->IBDataSet1->Active=true;
Caption="7777777777";

Form1->IBDataSet1->Active=false;
Form1->IBTransaction1->CommitRetaining();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::FormCreate(TObject *Sender)
{
this->IBDatabase1->Connected=true;
this->IBTransaction1->Active=true;
}
 
第一次点过后Form1->IBTable1->TableName="TMP_TJ";
但是你没有close它,所以第二次就要出错了"...TMP_TJ is in use"
 
谢谢Tab,我试过了,还是不行。
 
附加功能 将问题提前
 
我想应该把IBDatabase1断开,再连接。
 
否则interbase认为这个table正在使用,不能再次drop了。
 
为什么要用这种方式来判断一个表是否存在呢?IB 应该可以有其他的办法啊,类似 SQL Server 的
if exists (select * from Sysobjects ...)
 
mingcb:如果你还要继续讨论请定期提前你的帖子,如果不想继续讨论请结束帖子。
 
该表所在数据库呈连接状态时,如果该表被操作过,则被认为该表在使用中,
我在用isql时,浏览过该表后,换到其它表,再用drop就出现这样的问题,只有
与数据库disconect后才行
 
后退
顶部