当创建一个DBF表时,如果使用了MDX格式的索引文件,那么DBF表的表头中的某个字节就自动被设置了一个标志,当下次试图重新打开这个DBF表的时候,数据引擎会自动识别这个标志,如果此标志为真,则数据引擎将试图打开相应的MDX文件,当相应的MDX文件不存在时,错误就产生了。知道了问题产生的原因,解决方案也就有了:我们只需将那个标志字节(其实就是第28个字节)设为零就行了。下面为示范代码 unit Fixit;interfaceuses SysUtils,WinTypes,WinProcs,Messages,Classes,Graphics, Controls,Forms,Dialogs,StdCtrls,DB,DBTables,Grids,DBGrids;type TForm1=class(TForm) Table1:TTable; Button1:TButton; procedureButton1Click(Sender:TObject); private {Privatedeclarations} public {Publicdeclarations} end;var Form1:TForm1;implementation{$R*.DFM}const TheTableDir='c:\demo\'; TheTableName='animals.dbf'; //这是Delphi4/5自带的一个数据表,在..\Borland\Delphi5\Borland Shared\Data下,将它拷贝到Demo别名下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;procedureTForm1.Button1Click(Sender:TObject); //此procedure将试图打开一个表,如果相应的.MDX文件不存在将对表文件进行处理并尝试再次打开 begin try //为表设置路径 Table1.DatabaseName:=TheTableDir; //设置表的名字 Table1.TableName:=TheTableName; //尝试打开表 Table1.Open; except on E:EDBEngineError do //如果MDX文件未发现,将返回以下错误信息 if Pos('Indexdoesnotexist.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.
unit Fixit;interfaceuses SysUtils,WinTypes,WinProcs,Messages,Classes,Graphics,
Controls,Forms,Dialogs,StdCtrls,DB,DBTables,Grids,DBGrids;type
TForm1=class(TForm)
Table1:TTable;
Button1:TButton;
procedureButton1Click(Sender:TObject);
private
{Privatedeclarations}
public
{Publicdeclarations}
end;var
Form1:TForm1;implementation{$R*.DFM}const
TheTableDir='c:\demo\';
TheTableName='animals.dbf';
//这是Delphi4/5自带的一个数据表,在..\Borland\Delphi5\Borland Shared\Data下,将它拷贝到Demo别名下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;procedureTForm1.Button1Click(Sender:TObject);
//此procedure将试图打开一个表,如果相应的.MDX文件不存在将对表文件进行处理并尝试再次打开
begin
try
//为表设置路径
Table1.DatabaseName:=TheTableDir;
//设置表的名字
Table1.TableName:=TheTableName;
//尝试打开表
Table1.Open;
except
on E:EDBEngineError do
//如果MDX文件未发现,将返回以下错误信息
if Pos('Indexdoesnotexist.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.