急求PRODOX数据库修复工具(300分)

  • 主题发起人 主题发起人 XU Xuebin
  • 开始时间 开始时间
X

XU Xuebin

Unregistered / Unconfirmed
GUEST, unregistred user!
程序运行过程中机器掉电,造成PRODOX数据表索引文件损坏。再打开时提示
“Unable to open table // Currupt table/Index header”。鉴于同类情况今后
将时有发生,设想增加‘数据修复’模块,自动或手动修复数据库。估计网上会有
高手的作品,上来碰碰运气。请各位高人出手相助,最好是有源代码的完整模块。
 
给你一个完整的
---- 在 数 据 库 编 程 中, 索 引 文 件 对 于 改 善 数 据 查 询 速 度 有 着 举 足 轻 重 的 作 用, 充 分 使 用 索 引 文 件 可 以 极 大 改 善 数 据 库 应 用 程 序 的 性 能, 这 一 点 恐 怕 是 难 以 否 认 的.

---- 在 应 用 过 程 中, 用 户 的 查 询 条 件 可 能 是 多 种 多 样 的, 如 果 能 根 据 用 户 查 询 建 立 和 选 择 索 引, 对 于 保 证 应 用 程 序 的 性 能, 无 疑 是 很 有 帮 助 的.

---- 另 外, 由 于 停 电 等 意 外 事 故 很 容 易 造 成 数 据 库 中 的 索 引 文 件 未 及 时 更 新 甚 至 于 损 坏, 此 时 如 果 应 用 程 序 再 出 几 个 错 误 信 息, 无 疑 将 使 用 户 的 处 境 雪 上 加 霜.

---- 因 而, 动 态 维 护 数 据 库 索 引 文 件, 将 使 你 的 数 据 库 应 用 程 序 更 有 稳 定 性 和 可 靠 性. 笔 者 将 以Delphi 编 程 中 常 用 的Paradox 数 据 库 为 例, 介 绍 数 据 库 索 引 文 件 的 动 态 维 护.

---- Paradox 数 据 表 索 引 分 为 主 索 引(Primary Index) 即 关 键 字(Primary Key) 索 引 和 次 索 引(Secondary Index), 其 中 主 索 引 对 应.PX 文 件, 次 索 引 对 应.XG* 和.YG* 文 件.

一. 创 建 表 索 引
---- (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.
 
重新建索引
 
两位指教的方法都试过,甚至把DBF文件的第28个BYTE改成0的方法也用了,
问题是根本无法打开数据表。原因何在,请指教!
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
927
SUNSTONE的Delphi笔记
S
后退
顶部