关于超想
本站导航
邮件列表
  首页 | 本站产品 | Delphi资料 | 免费资源 | 程序人生 | 软件工程 | 网站设计 | 推荐网站
你所在的位置 -> 主页 -> 超想软件 -> 编程资料 -> delphi -> 开发技巧 -> 数据库-SQL ->详细
相关内容  
 
 
在程序运行期设置QUERY控件的PARAMS
 
【新品推荐】

  详细内容
 

解决一个DBF表时的Index not found..错误
作者: 评价: 上站日期: 2001-05-09
内容说明:
来源:

  当 你 创 建 一 个 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.
 




 
你所在的位置 -> 主页 -> 超想软件 -> 编程资料 -> delphi -> 开发技巧 -> 数据库-SQL ->详细
  首页 | 本站产品 | Delphi资料 | 免费资源 | 程序人生 | 软件工程 | 网站设计 | 推荐网站
声明:本站内容除注明原创以外均从网上摘抄,如有侵权请指明。
  如果您对我们的网站有什么意见或者建议,请与我们联系
powered by 建站易上手- V2.0