Delphi垃圾吗,连建个索引都不行?用Table.AddIndex()方法!
需上机通过验证代码!
建个索引,用Table.AddIndex()方法!谁会?需上机通过验证代码!

解决方案 »

  1.   

    创 建 表 索 引 
    ---- (1) 用Table.AddIndex 来 实 现 
    ---- 方 法:AddIndex( IndexName,FieldNames,Options ) 
    ---- 其 中:( 详 见Delphi 帮 助) 
    ---- IndexName: 索 引 名 称, 仅 在 指 定 次 索 引 时 有 作 用. 
    ---- FieldNames: 索 引 域, 可 指 定 多 个 域, 各 域 之 间 用 分 号 隔 开, 如'Field1;Field2;Field3' 
    ---- Options: 索 引 选 项, 可 为[ixPrimary, ixUnique, ixDescending, ixCaseInsensitive, ixExpression] 
    ---- 其 中: 
    ---- ixPrimary : 建 立 的 索 引 为 主 索 引( 不 适 用 于dBase 数 据 表). 
    ---- ixUnique : 不 允 许 重 复 值 的 索 引. 
    ---- ixDescending: 按 降 序 索 引. 
    ---- ixCaseInsensitive: 索 引 排 序 时 按 忽 略 大 小 写( 不 适 用 于dBase 数 据 表). 
    ---- ixExpression: 建 立 表 达 式 索 引( 适 用 于Delphi3.0, 仅 适 用 于dBase 数 据 表). 
    ---- ixNonMaintained: 是 否 不 需 要BDE 自 动 维 护( 适 用 于Delphi1.0). ---- 下 面 是 一 个 例 子: ---- 假 设 有 一 个 存 放 通 讯 录 数 据 表MyComm.DB( 类 型 为Paradox) 存 放 于 本 地 目 录d:\mynote 下, 现 建 立 一 个 主 索 引( 索 引 域 为 编 号ID) 和 一 个 次 索 引( 索 引 域 为 编 号ID 和 姓 名Name, 索 引 名 称 为NameIndex).   with table1 do
         begin
       close;
       Exclusive := true;
       DatabaseName := 'd:\MyNote';
       TableName := 'MyComm.DB';
       Open;   {建立主索引 }
       AddIndex('','ID',[ixPrimary]);   {建立次索引 }
       AddIndex('NameIndex','ID;Name',[]);
       
       close;
         end;
      (2)用SQL来实现
     对Paradox数据表来说,用SQL只能建立次索引.
     在SQL语法中,用来建立索引的语句是:
      Create Index IndexName On TableName
      (IndexField1,IndexField2,..)
     其中:
      IndexName为一个次索引的名称,如MySecIndex1等.
      TableName为对应数据表的名称,如MyTable等.
      TableName后面为索引域列表,所有索引域有圆括号括起来,
       各索引域之间用逗号隔开.
     ---- 下 面 是 一 个 例 子: ---- 假 设 有 一 个 存 放 通 讯 录 数 据 表MyComm.DB( 类 型 为Paradox) 存 放 于 本 地 目 录 ---- d:\mynote 下, 现 建 立 一 个 次 索 引( 索 引 域 为 编 号ID 和 姓 名Name, 索 引 名 称 为NameIndex).  with query1 do
     begin
     close;
     DatabaseName := 'd:\MyNote';{建立次索引NameIndex}
      sql.clear;
      sql.add( 'Create Index NameIndex On MyComm(ID,Name)' );
         execSql;
     end;
     二. 删 除 表 索 引 
    ---- (1) 用Table.DeleteIndex 来 实 现 
    ---- DeleteIndex 只 能 删 除 次 索 引 名 称. 
    ---- 方 法:DeleteIndex( IndexName ) 
    ---- 其 中:( 详 见Delphi 帮 助) 
    ---- IndexName: 次 索 引 名 称. ---- 下 面 是 一 个 例 子: ---- 假 设 有 一 个 存 放 通 讯 录 数 据 表MyComm.DB( 类 型 为Paradox) 存 放 于 本 地 目 录 ---- d:\mynote 下, 现 有 一 个 次 索 引( 索 引 域 为 编 号ID 和 姓 名Name, 索 引 名 称 为NameIndex), 将 删 除 之.   with table1 do
         begin
       close;
       Exclusive := true;
       DatabaseName := 'd:\MyNote';
       TableName := 'MyComm.DB';
       Open;   {删除次索引}
       DeleteIndex('NameIndex');
       
       close;
         end;
     ---- (2) 用SQL 来 实 现 
    ---- 在SQL 语 法 中, 用 来 删 除 索 引 的 语 句 是: 
    ---- Drop Index TableName.IndexName 
    ---- 要 删 除 次 索 引 时,IndexName 为 一 个 次 索 引 的 名 称, 如'MyTable.MySecIndex1' 等. 
    ---- 要 删 除 主 索 引 时,IndexName 为'primary', 如'MyTable.primary'; 值 得 注 意 的 是, 在 删 除 主 索 引 成 功 后, 数 据 表 的 所 有 次 索 引 也 自 动 删 除. ---- 下 面 是 一 个 例 子: 
    ---- 假 设 有 一 个 存 放 通 讯 录 数 据 表MyComm.DB( 类 型 为Paradox) 存 放 于 本 地 目 录 
    ---- d:\mynote 下, 已 定 义 一 个 主 索 引( 索 引 域 为 编 号ID) 和 一 个 次 索 引( 索 引 域 为 编 号ID 和 姓 名Name, 索 引 名 称 为NameIndex). 
    ---- 现 在 因 为 索 引 损 坏, 要 删 除 索 引, 以 便 重 新 索 引.   with query1 do
         begin
       close;
       DatabaseName := 'd:\MyNote';   {删除次索引NameIndex }
              sql.clear;
              sql.add( 'Drop Index MyComm.NameIndex' );
              execSql;   {删除主索引 }
              sql.clear;
              sql.add( 'Drop Index MyComm.Primary' );
              execSql;
         end;
     三. 注 意 事 项: 
    ---- (1) 在 索 引 更 改 时, 应 保 证 对 应 的 数 据 表 可 以 以 独 占 方 式(Exclusive=true) 打 开, 否 则 会 引 起 错 误. 
    ---- (2) 上 述 方 法 略 加 修 改 后, 也 可 用 于dBase,Oracle 等 其 它 数 据 库 的 数 据 表. 
    ---- (3) 如 果 需 要 重 新 对 索 引 文 件 进 行 索 引, 请 参 考BDE 的Dbi 函 数 说 明: 
    ---- RegenIndex, RegenIndexes. 
      

  2.   

    你上机试过没有?Delphi6.0环境下能通过吗?代码将会产生异常:Table is busy!with table1 do
         begin
       close;
       Exclusive := true;
       DatabaseName := 'd:\MyNote';
       TableName := 'MyComm.DB';
       Open;   {建立主索引 }
       AddIndex('','ID',[ixPrimary]);   {建立次索引 }
       AddIndex('NameIndex','ID;Name',[]);
       
       close;
      

  3.   

    Is there no body can answer the question?
      

  4.   

    感谢axcyy网友的大力支持!动态建立索引的问题解决了,归纳如下。我的目的:
    使用Table组件的AddIndex方法给一个已存在的数据表建立索引。问题的产生:
     建立一个空的窗体,放一个Table组件,一个DataSource组件,一个DBGird组件,和一个按钮。其中Table组件连接表,DataSource的DataBaseName属性为Table1,DBGird
    的DataBaseName属性为DataSoure1,Table的DataBaseName为BDE_DB,Table属性为    Unsday.db,Active为true,然后建立按钮的Click事件。
     另:BDE别名:BDE_DB
            type: standard
           default driver: Paradox
             Endable Bcd: False
                   Path: D:\Delphi\DBF
     然后编辑按钮Click事件代码:
    procedure TForm3.Button1Click(Sender: TObject);
    begin
    Table1.Active:=False;
    Table1.AddIndex('IdxStime','STIME',[ixPrimary]);//  其中STIME是一个字段名.
    Table1.Active:=True;
    end;保存并按F9运行,出现EBDEngineError异常,'Table is busy'错误。解决办法:
    1. 在设计期间,将Table的Active属性改回缺省值False(原来我是设为True的,就是这个原因!)。
    2. 代码没有问题,很多网友说的方法都是指代码,都可以的(谢谢大家!),我试过了,但关键是设计时的Active属性值须是False;
    Table1.Active:=False;     //这个也不能少,就算不需要下面的第三步,也不能少.
    Table1.Exclusive:=True;
    Table1.AddIndex('索引名’,'要索引的字段',[索引选项]);
    Table1.Exclusive:=false;
    Table1.Active:=True;
    3. 如果要在窗体建成后就看到数据,则同时把Table1.Active:=True;放到窗体的OnActive事件中。
    这样以后,你可以在表窗体中看到数据,并且动态建立表索引。问题原因:
       Delphi的连接数据表的机制我还不太明白,它的帮助中也没有说这些。虽然Table的Active属性在设计时的缺省值是false,但我把它改为了true,连接数据表,因为我要在窗体出来后就看到表里的数据。这样就造成了问题。
       虽然问题的解决办法有了,但我还是不明白,想问问Borland公司的Delphi的开发人员,Active属性在设计时的值和代码指定值有什么不一样?设计时的Active为false,而我
    在代码中不是早就有Active:=False;了吗,后者为什么不行?而现在的解决办法是:  1 在属性栏中的Active为False;         // 必须有
      2. .在窗体的OnActive事件中有语句Table1.Active:=True; //连接数据表,可不要
      3. 在建索引的代码中还要有Table1.Active:=False:  // 必须有注,第二步也可不要,区别是窗体建立时看不到表中数据。解决过程:
       这个问题困扰了我整整三天,这期间很多网友都给我出了主意,想办法,最终还是由网友axcyy通过实时QQ交流,并将源代码发给他调试,花费一个下午的时间才搞定。非常感谢axcyy网友的帮助,谢谢!另外:
       Delphi支持的paradox数据表db的相关特性也增加了困难,如在没有主索引的情况下不能建其它索引(DB表不如DBF表好).附:我在CSDN上的提问如下:
    =====================================================================
    最近我在用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???????????????????????????????????????????