最近我在用Table组件编写单机数据库程序,基中用到Table的AddIndex方法,可是看了
Delphi的连机帮助和资料上的例子,都不能达到结果,真的有点麻烦,现在我把开发过程
和各位说一下,希望高手和行家指点指点,我快被逼疯了。:(开发环境如下,家里和单位都是同样的运行结果。
 单位:Windows2000 professional,Delphi EnterPrise 6.0 (Build6.163)
       同系统装有Visiual Stuio 6.0 (VC,VB,VFP)(同装有问题吗?)  家里: Windows98第二版,Delphi EnterPrise 6.0 (Build6.163)
       同系统装有Visiual Stuio 6.0 (VC,VB,VFP)(同装有问题吗?)开发要求:
  使用Table组件的AddIndex方法给一个已存在的数据表建立索引。步骤:
1. 数据表为D:\Delphi\DBF\UnsDay.DB,Paradox的
2. 建立BDE别名:BDE_DB
        type: standard
     default driver: Paradox
        Endable Bcd: False
               Path: D:\Delphi\DBF
3. 建立一个空的的窗体,放一个Table组件,一个DataSource组件,一个DBGird组件,
  和一个按钮。
  Table组件连接表,DataSource的DataBaseName属性为Table1,DBGird的 
    DataBaseName属性为DataSoure1,Table的DataBaseName为BDE_DB,Table属性为
    Unsday.db,Active为true,然后建立按钮的Click事件。4.编辑Click事件代码:
procedure TForm3.Button1Click(Sender: TObject);
begin
Table1.Active:=False;
Table1.AddIndex('IdxStime','STIME',[ixPrimary]);//  其中STIME是一个字段名.
Table1.Active:=True;
end;5. 保存并按F9运行,出现EBDEngineError异常,'Table is busy'错误。问题:表是忙的?我的数据表这时除了Delphi在使用,没有其它程序在用。此时我在CSDN
      上问了一下,并查了一些资料,加入如下语句,但还是不行,问题依旧‘Table is 
      busy’。   Table1.Active:=False;
   Table1.Close;
   Table1.Exclusive:=True;   Table1.AddIndex('IdxStime','STIME',[ixPrimary]);   Table1.Exclusive:=False;
   Table1.Open;
   Table1.Active:=True;
   
  
   后又想到把其它组件与Table的连接断开,用Table的DisableControls和Enable
   Controls两个属性,编译运行,不行!
     Table1.DisableControls;
     Table1.Active:=False;
     Table1.Close;
     Table1.Exclusive:=True;     Table1.AddIndex('IdxStime','STIME',[ixPrimary]);     Table1.Exclusive:=False;
     Table1.Open;
     Table1.Active:=True;
     Table1.EnableControls;      想了很久,觉得表忙的话是不是有程序在用,或是组件?与是把Table组件与其它
   组件断开,去掉DataSoure和DBGird组件,再编译运行,不行!   然后我在www.yahoo.com中输入Table is busy关键字搜索到一篇英文资料,说是
   表好象要锁定什么的,于返回Delphi帮助,查到Table类的方法lock和unlock, 
      表忙的错误没了,可是又出现双重否定的结果,说是索引不能建在关闭的DataSet
   上,与是把DataSet打开(open或active:=true),又说索引不能建在打开的DataSeth ,天哪?索引即不能建在打开的数据集上,也不能在关闭的数据集上,那在
   什么上可建呢?我快疯了,感觉被BDE给嫖死了!!!!!!!!!      Table1.Active:=False;
      Table1.Close;
      Table1.Exclusive:=True;
      Table1.LockTable(ltWriteLock);  // 锁定表,一开始我是读锁定,不行,改成
                    //  写锁定是可以了。      Table1.AddIndex('IdxStime','STIME',[ixPrimary]);      Table1.UnLockTable(ltWriteLock);
      Table1.Exclusive:=False;
      Table1.Open;
      Table1.Active:=True;   已经过去两天了,我在CSDN上也提了很多个这样的问题,可最终还是没有建成索引,
  Delphi的帮助只介绍了AddIndex方法本身的用法,示例也就是一句,连Active要
  设成False的提示也没有,就是说AddIndex相关的其它东西都没有说。很多网友让
  我看帮助,可是我已经看了N次了,自认为英文还能过的去,实在不行时用金山词霸
  指点一下。  再次,我将Table的类库DBtables.pas中的AddIndex函数中的每一个执行语句后加
  入ShowMessage提示,想知道运行哪一个语句错了,可惜没有一个看到,可见连
   AddIndex函数体都没有进入,和我用F7调试结果一样,为什么呢?  然后我去看BDE,设置也是好的,用SqL Expoloer的SQL语句
   Create index idxstime on unsday (stime) 建立索引是可以的,BDE没问题
  呀。
  有哪位高手知道我的这个问题是怎么产生的?如何解决?是代码语句问题还是该语句  的相关配合设置没有设好?或是BDE有问题?    很多网友贴出来的关于AddIndex方法资料文章似乎和我已有一样,没有上机测试过,
  另外,Delphi的版本不同,同一方法的使用也有不一样的。这里谢谢了。  谁能告诉我如何DeBug???????????????????????????????????????????
  

解决方案 »

  1.   

    这个和你的程序无关,只是和数据库有关,
    我运行你开始的代码,在oracle8中没有一点问题。
    你怎么要动态的创建索引,建表时创建不行?
      

  2.   

    你再读Delphi的关于Addindex的帮助,你出现的问题我在以前也遇到过好象是和创建的索引类型有关
      

  3.   

    其实可以不用索引也能达到目的:
    用TABLE+SQL(SELECT * FROM TABLE1 ORDER BY FIELDNAME)+QUERY
    用ADOTABLE.SORT:='FIELDNNAME ASC(DESC)'
      

  4.   

    to  tw_cshn(一无所有) :是单机版数据库程序,为加快检索,要动态建索
      

  5.   

    在你前三个贴子我都做了回复,在delphi中的DBDEMOS中建立索引的时候也遇到了你所说的情况。原因我不知道在那里,我在建立个Paradox表,做一个试试,如果我通过了,那就是你的问题。
      

  6.   

    procedure TForm1.Button1Click(Sender: TObject);
    begin
      with ttable.Create(self) do
        begin
          databasename:='d:\table';
          tablename:='foo';
          tabletype:=ttparadox;
          with fielddefs do begin
            add('age',ftinteger,0,true);
            add('name',ftstring,25,false);
            add('weight',ftfloat,0,false);
          end;
          createtable;
          showmessage('ok');
        end;
    end;procedure TForm1.Button2Click(Sender: TObject);
    begin
      table1.DatabaseName:='d:\table';
      table1.TableName:='foo';
      table1.TableType:=ttparadox;
      with table1 do begin
        close;
        AddIndex('tempindex','age',[ixprimary]);
        showmessage('thanks');
        close;
      end;
    end;
    这是我在delphi6+win2000下的代码。完全通过OK。
    估计可能是你的问题。你按照我的代码去试,肯定行。