最近我在用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.   

    好象我早上回答 了这个问题吧!而且我也调试过的,没有问题呀!我用的是DELPHI6呀!一点问题也没有!而且如果你要建索引 的话,也不一定非要AddIndex函数呀,还可以用SQL 语句中的create index来做吧!
      

  2.   

    Paradox的表好象只能在创建的时候建立关键字,你用
    Create index idxstime on unsday (stime)只能是创建第二索引,所以可以成功,但你用
    Table1.AddIndex('IdxStime','STIME',[ixPrimary]);
    应该是创建主索引也就是关键字吧,所以不行。
    我不能确定,但我自己用的时候是有这个问题,在能在create table时定义主索引。
      

  3.   

    没想到你还没有解决。
    我前几天也是用BDE+Paradox做得。可以的。
    ly_88(飞龙)说不行。我觉得没有道理。建立索引只要表在其他的程序访问的情况下应该都可以建立的。
    我就是在建立索引之后,用AddIndex.直接建立的。
    AddIndex()是这样解释的。用于建立一个新的索引。其中,NAME参数用于指定索引的名字。Fields参数是一个字符串,用于指定索引的字段,字段与字段之间要用分号隔开;OPTIONS参数用于设置索引的选项,TIndexOptions是一个集合,可以包含下列元素:
    ixPrimary: 建立主索引(不能用乎DBASE表)
    ixUnique: 字段的值必须是相异的;
    ixDescedning; 按降序排列;
    IxCase Insensitive;大小写不敏感
    IxExpression;创建DBASE表达式索引对了,你的TABLE的Active是在程序启动后打开的,还是原本打开的。
    如果你原本就是打开的,可能问题会出在那里。你试试看。
    不行的话,你把代码给我。我帮你看看。:)
      

  4.   

    代码没有问题,是Active属性,我在设计期间把Table的Active设为True了,
    所以会出现这些问题,把它设为False,然后在代码中再加入Active:=False;
    才能建索引。具体请看我的归纳贴,谢谢axcyy!
      

  5.   

    我为了你的问题,还专门做了测试!我说了 能用的,但是楼主好象不信呀!没有办法了!
    http://expert.csdn.net/Expert/topic/1116/1116758.xml?temp=.1722376procedure TForm1.Button1Click(Sender: TObject);
    begin
      Table1.Close;   //在这里我就已经写好了,但是,楼主没有注意罢了!
      table1.Exclusive := True;
      Table1.AddIndex('NewIndex1', 'CustNo', [ixPrimary]);
      table1.Exclusive := false;
      Table1.Open;
    end;以上代码是经过我验证的代码,一定没有问题