Delphi垃圾吗,连建个索引都不行?用Table.AddIndex()方法!
需上机通过验证代码!
建个索引,用Table.AddIndex()方法!谁会?需上机通过验证代码!
需上机通过验证代码!
建个索引,用Table.AddIndex()方法!谁会?需上机通过验证代码!
解决方案 »
- 为什么会报错:OBJECT expected on line 1. 代码如下,能给出相应参考文件最好了!在线等,急!
- 运行的时候报 the maximum number of application is already ……,是什么问题?
- 请教一下delphi多线程的问题
- 在多线程中,用文件记录过程。用什么写文件比较好??
- 如何将adoquery中字段为空的全部填上0,字段为数字型
- 怎么才能用winsock的connect函数建立到163或其他站点连接?
- delphi菜鸟一个问题.着急急急急急急急急急急急急急急急急急急急急急急急急
- 问2个软件使用久了程序出错的问题。
- 请教MDI子窗体在客户区显示位置的问题,以及子窗体个数控制的问题?
- 文件捆绑机怎么删除文件?
- 建个索引,用Table.AddIndex()方法!谁会?需上机通过验证代码!
- TDateTime变量DateTime1如何取得Time值?
---- (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.
begin
close;
Exclusive := true;
DatabaseName := 'd:\MyNote';
TableName := 'MyComm.DB';
Open; {建立主索引 }
AddIndex('','ID',[ixPrimary]); {建立次索引 }
AddIndex('NameIndex','ID;Name',[]);
close;
使用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???????????????????????????????????????????