delphi 编程技巧

源代码在线查看: 如何打开一个dbf文件而避免“mdx文件未发现”之错.txt

软件大小: 774 K
上传用户: zyhunicom
关键词: delphi 编程技巧
下载地址: 免注册下载 普通下载 VIP

相关代码

				如何打开一个DBF文件而避免“MDX文件未发现”之错误 (2000年11月21日) 
				
				本站更新  分类:   作者:a  推荐:   阅读次数:414  
				(http://www.codesky.net)  
				
				--------------------------------------------------------------------------------
				为 什 么 我 打 开 一 个 DBF 表 的 时 候 会 得 到 “ Index not found.. ” 这 样 的 错 误 ? 
				
				答 : 当 你 创 建 一 个 DBF 表 时 , 如 果 使 用 了 MDX 格 式 的 索 引 文 件 ,
				那 么 DBF 表 的 表 头 中 的 某 个 字 节 就 自 动 被 设 置 了 一 个 标 志 , 当 你 下 次 试 
				图 重 新 打 开 这 个 DBF 表 的 时 候 , 数 据 引 擎 会 自 动 识 别 这 个 标 志 , 如 果 此 
				标 志 为 真 , 则 数 据 引 擎 将 试 图 打 开 相 应 的 MDX 文 件 , 当 相 应 的 MDX 文 件 不
				存 在 时 , 错 误 就 产 生 了 。 知 道 了 问 题 产 生 的 原 因 , 解 决 方 案 也 就 有 了 :
				我 们 只 需 将 那 个 标 志 字 节 ( 其 实 就 是 第 28 个 字 节 ) 设 为 零 就 行 了 。 下 
				面 为 示 范 代 码 : 
				
				unit Fixit;
				
				interface
				
				uses
				SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics,
				Controls, Forms, Dialogs, StdCtrls, DB, DBTables, Grids, DBGrids;
				
				type
				TForm1 = class(TForm)
				Table1: TTable;
				Button1: TButton;
				procedure Button1Click(Sender: TObject);
				private
				{ Private declarations }
				public
				{ Public declarations }
				end;
				
				var
				Form1: TForm1;
				
				implementation
				
				{$R *.DFM}
				
				const
				TheTableDir = 'c:\temp\';
				TheTableName = 'animals.dbf';
				
				procedure RemoveMDXByte(dbFile: String);
				{ 这 个 procedure 的 参 数 是 一 个 文 件 名 , 它 将 对 这 个 文 件 的 文 件 头 }
				{ 进 行 处 理 , 以 确 保 它 不 在 需 要 MDX }
				const
				Value: Byte = 0;
				var
				F: File of byte;
				begin
				AssignFile(F, dbFile);
				Reset(F);
				Seek(F, 28);
				Write(F, Value);
				CloseFile(F);
				end;
				
				procedure TForm1.Button1Click(Sender: TObject);
				{ 此 procedure 将 试 图 打 开 一 个 表 , 如 果 相 应 的 .MDX 文 件 不 存 在 }
				{ 将 对 表 文 件 进 行 处 理 并 尝 试 再 次 打 开 }
				begin
				try
				{ 为 表 设 置 路 径 }
				Table1.DatabaseName := TheTableDir;
				{ 设 置 表 的 名 字 }
				Table1.TableName := TheTableName;
				{ 尝 试 打 开 表 }
				Table1.Open;
				except
				on E:EDBEngineError do
				{ 如 果 MDX 文 件 未 发 现 , 将 返 回 以 下 错 误 信 息 }
				if Pos('Index does not exist. File', E.Message)>0 then begin
				{ 询 问 用 户 是 否 继 续 }
				MessageDlg('MDX file not found. Attempting to open
				without index.', mtWarning, [mbOk], 0);
				{ 从 表 头 中 移 去 相 应 标 志 }
				RemoveMDXByte(TheTableDir + TheTableName);
				{ 再 次 向 Button1 发 送 被 按 下 的 消 息 , 本 procedure 再 次 被 执 行 }
				PostMessage(Button1.Handle, cn_Command, bn_Clicked, 0);
				end;
				end;
				end;
				
				end.
				 
				 
							

相关资源