打开一个.dbc文件,系统显示该数据库is not a database,怎么办,急求!!!

qianyi19730513 2005-12-08 04:19:52
如题
...全文
2798 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
十豆三 2005-12-08
  • 打赏
  • 举报
回复
恢复无法打开的数据库文件(*.dbc)

-----方法一:
执行
VALIDATE DATABASE RECOVER
命令看看有什么效果,语法如下:
*---------------------------------
保证当前数据库中表和索引位置的正确性。

Validate Database [RECOVER] [NOCONSOLE]
[TO PRINTER [PROMPT] | TO FILE FileName]
参数
RECOVER
显示一个对话框,该对话框允许您定位表和索引,这些表和索引不在被检查的数据库中。必须在命令窗口中发出 Validate Database RECOVER 命令,在程序中发布该命令会产生错误信息。
NOCONSOLE
不向 Visual FoxPro 主窗口或活动的用户自定义窗口输出错误信息。
TO PRINTER [PROMPT]
将 VALIDATE DATABASE 命令的错误信息定向输出到打印机。
PROMPT 在打印前显示“打印”对话框,该关键字应紧跟在 TO PRINTER 之后。

TO FILE FileName
将错误信息定向输出到由 FileName 参数指定的文件,如果该文件已经存在,并且 SET SAFETY 值为 ON,系统会询问是否要覆盖该文件。
备注
VALIDATE DATABASE 命令确保数据库包含的表和索引处于正确位置,确保数据库中的表包含正确的字段,以及确定数据库中索引标识是否存在。

VALIDATE DATABASE 命令在当前数据库上操作。在发布 OPEN DATABASE 命令打开此数据库时,必须包含 EXCLUSIVE 关键字,以独占方式打开。

示例
下面的示例打开 testdata 数据库并使用 VALIDATE DATABASE 命令,以确定表和索引的位置在数据库中是正确的。

CLOSE DATABASES
SET PATH TO (HOME(2) + 'Data\') && 设置数据库路径
OPEN DATABASE testdata EXCLUSIVE && 打开 testdata 数据库

Validate Database

*------------------------------
如果还是不行,
就只好:
1、删除dbc文件
2、去掉所有dbf文件对数据库的引用
3、再新建一个dbc
4、然后加入所有dbf文件

------方法二:

在使用VFP数据库软件时,有时会发生数据库文件无法打开的错误,如:(1) not a database file(不是数据库文件) 。(2) memo file is missing/invalid(备注文件丢失/无效)等。若无法打开的数据库文件不能恢复,将给用户带来损失。那么如何恢复无法打开的数据库文件呢?首先须清楚数据库文件的结构。VFP中的数据库文件由文件描述部分和文件的数据内容两部分组成。文件的描述部分在文件前部,描述部分结束后是文件中存储的数据记录。文件描述又分成两部分:文件的整体结构的描述和每个字段的描述。整体结构描述由文件的第一个字节开始,共需32个字节。其中:
  第1字节:备注文件标志位;
  第2~4字节:文件的最后修改日期(年,月,日);
  第5~8字节:文件记录数,低位在前高位在后;
  第9~10字节:数据计录内容存储的开始位置,即字段描述结束后的下一个字节位置,低位在前高位在后;
  第11~12字节:记录长度(全部字段长之和),低位在前高位在后;
  第29字节:组合索引文件存在标记。
  从第33个字节开始,每32个字节描述一个字段。
  第1字节为“f5”表示数据库文件应有备注文件,若无备注文件欲打开该数据库文件就会出现本文开头的错误信息(2),此时只须将“f5”改成“03”即可(用pctool),“03”表示数据库文件无备注文件。
  第29字节为“01”,表示数据库文件打开的同时打开组合索引文件。若无组合索引文件,也会出现错误提示信息,将“01”改成“00”即可,“00”表示数据库文件无组合索引文件。
  欲打开数据库文件,屏幕报告“not a database file”(不是数据库文件)错误,是由于第5~8字节表示的文件记录数大于数据库文件实际记录数(若小于等于数据库文件实际记录数则不会报告错误),此时恢复该数据库文件只要获得文件的实际记录数,用手工方法修改文件的第5~8字节。数据库文件实际记录数可以通过下面的公式计算:
  记录数=(文件长度-文件描述部分长度-文件结束标志长度)/记录长度式中,文件长度可通过“dir”命令获得;
  文件描述部分长度=(第10字节)10 *256+(第9字节)10 ;
  文件结束标志长度=1;
  记录长度=(第12字节)10 *256+(第11字节)10;
  若是数据库文件上述公式一定能整除,由公式计算出的记录数再换算成16进制填入文件的第5~8字节,注意低位在前高位在后。
  根据上述过程笔者用c语言编写了恢复该数据库文件的程序modi.cpp(该程序在bc31 for dos下编译通过):
  #include
  #include
  #include
  int main(int argc,char *argv[])
  {
   file *fp;
   unsigned int c[4],i;
   long int total,records;
   if(argc!=2){
   printf("no file name!\n");
  exit(1);
  }
   if( (fp=fopen(argv[1],"r+b"))==null){
   printf("not find %s!\n",argv[1]);
   exit(1);
   }
   total=filelength(fileno(fp));//获得文件长度
   rewind(fp);
   i=fgetc(fp); //读取第1个字节的值
   if (i!=0xf3&&i!=0x03){
   fseek(fp,-1l,1);
   fputc(0x03,fp); //第1个字节的值若不为“f3”或“03”
   } //则强迫为“03”
   rewind(fp);
   fseek(fp,8l,1); //指针指向第9字节
   c[0]=fgetc(fp); //读取第9~12字节的值
   c[1]=fgetc(fp);
   c[2]=fgetc(fp);
   c[3]=fgetc(fp);
   records=(total-c[1]*256+c[0]-1)/(c[2]+c[3]*256);//计算记录数
   c[0]=records%256; //c[0]~c[3]计算第5~8字节的值
   c[1]=(records-c[3]*256*256*256-c[2]*256*256)/256;
   c[2]=(records-c[3]*256*256*256)/65536;
   c[3]=records/256/256/256;
   fseek(fp,-8l,1); //指针指向第5字节
   fputc(c[0],fp); //将c[0]~c[3]写入第5~8字节
   fputc(c[1],fp);
   fputc(c[2],fp);
   fputc(c[3],fp);
   printf("modify the database file successfully!\n");
   fclose(fp);
   return 1;

--------方法三:
将所有的dbf,cdx,dbc文件都删除了。然后用它们的备分文件件,bak,dcx,bdc分别改名,然后,在项目里打开数据库,将里面的所有表移除,删除数据库,再新新建数据库,再将表加入。
十豆三 2005-12-08
  • 打赏
  • 举报
回复
恢复无法打开的数据库文件(*.dbc)

-----方法一:
执行
VALIDATE DATABASE RECOVER
命令看看有什么效果,语法如下:
*---------------------------------
保证当前数据库中表和索引位置的正确性。

Validate Database [RECOVER] [NOCONSOLE]
[TO PRINTER [PROMPT] | TO FILE FileName]
参数
RECOVER
显示一个对话框,该对话框允许您定位表和索引,这些表和索引不在被检查的数据库中。必须在命令窗口中发出 Validate Database RECOVER 命令,在程序中发布该命令会产生错误信息。
NOCONSOLE
不向 Visual FoxPro 主窗口或活动的用户自定义窗口输出错误信息。
TO PRINTER [PROMPT]
将 VALIDATE DATABASE 命令的错误信息定向输出到打印机。
PROMPT 在打印前显示“打印”对话框,该关键字应紧跟在 TO PRINTER 之后。

TO FILE FileName
将错误信息定向输出到由 FileName 参数指定的文件,如果该文件已经存在,并且 SET SAFETY 值为 ON,系统会询问是否要覆盖该文件。
备注
VALIDATE DATABASE 命令确保数据库包含的表和索引处于正确位置,确保数据库中的表包含正确的字段,以及确定数据库中索引标识是否存在。

VALIDATE DATABASE 命令在当前数据库上操作。在发布 OPEN DATABASE 命令打开此数据库时,必须包含 EXCLUSIVE 关键字,以独占方式打开。

示例
下面的示例打开 testdata 数据库并使用 VALIDATE DATABASE 命令,以确定表和索引的位置在数据库中是正确的。

CLOSE DATABASES
SET PATH TO (HOME(2) + 'Data\') && 设置数据库路径
OPEN DATABASE testdata EXCLUSIVE && 打开 testdata 数据库

Validate Database

*------------------------------
如果还是不行,
就只好:
1、删除dbc文件
2、去掉所有dbf文件对数据库的引用
3、再新建一个dbc
4、然后加入所有dbf文件

------方法二:

在使用VFP数据库软件时,有时会发生数据库文件无法打开的错误,如:(1) not a database file(不是数据库文件) 。(2) memo file is missing/invalid(备注文件丢失/无效)等。若无法打开的数据库文件不能恢复,将给用户带来损失。那么如何恢复无法打开的数据库文件呢?首先须清楚数据库文件的结构。VFP中的数据库文件由文件描述部分和文件的数据内容两部分组成。文件的描述部分在文件前部,描述部分结束后是文件中存储的数据记录。文件描述又分成两部分:文件的整体结构的描述和每个字段的描述。整体结构描述由文件的第一个字节开始,共需32个字节。其中:
  第1字节:备注文件标志位;
  第2~4字节:文件的最后修改日期(年,月,日);
  第5~8字节:文件记录数,低位在前高位在后;
  第9~10字节:数据计录内容存储的开始位置,即字段描述结束后的下一个字节位置,低位在前高位在后;
  第11~12字节:记录长度(全部字段长之和),低位在前高位在后;
  第29字节:组合索引文件存在标记。
  从第33个字节开始,每32个字节描述一个字段。
  第1字节为“f5”表示数据库文件应有备注文件,若无备注文件欲打开该数据库文件就会出现本文开头的错误信息(2),此时只须将“f5”改成“03”即可(用pctool),“03”表示数据库文件无备注文件。
  第29字节为“01”,表示数据库文件打开的同时打开组合索引文件。若无组合索引文件,也会出现错误提示信息,将“01”改成“00”即可,“00”表示数据库文件无组合索引文件。
  欲打开数据库文件,屏幕报告“not a database file”(不是数据库文件)错误,是由于第5~8字节表示的文件记录数大于数据库文件实际记录数(若小于等于数据库文件实际记录数则不会报告错误),此时恢复该数据库文件只要获得文件的实际记录数,用手工方法修改文件的第5~8字节。数据库文件实际记录数可以通过下面的公式计算:
  记录数=(文件长度-文件描述部分长度-文件结束标志长度)/记录长度式中,文件长度可通过“dir”命令获得;
  文件描述部分长度=(第10字节)10 *256+(第9字节)10 ;
  文件结束标志长度=1;
  记录长度=(第12字节)10 *256+(第11字节)10;
  若是数据库文件上述公式一定能整除,由公式计算出的记录数再换算成16进制填入文件的第5~8字节,注意低位在前高位在后。
  根据上述过程笔者用c语言编写了恢复该数据库文件的程序modi.cpp(该程序在bc31 for dos下编译通过):
  #include
  #include
  #include
  int main(int argc,char *argv[])
  {
   file *fp;
   unsigned int c[4],i;
   long int total,records;
   if(argc!=2){
   printf("no file name!\n");
  exit(1);
  }
   if( (fp=fopen(argv[1],"r+b"))==null){
   printf("not find %s!\n",argv[1]);
   exit(1);
   }
   total=filelength(fileno(fp));//获得文件长度
   rewind(fp);
   i=fgetc(fp); //读取第1个字节的值
   if (i!=0xf3&&i!=0x03){
   fseek(fp,-1l,1);
   fputc(0x03,fp); //第1个字节的值若不为“f3”或“03”
   } //则强迫为“03”
   rewind(fp);
   fseek(fp,8l,1); //指针指向第9字节
   c[0]=fgetc(fp); //读取第9~12字节的值
   c[1]=fgetc(fp);
   c[2]=fgetc(fp);
   c[3]=fgetc(fp);
   records=(total-c[1]*256+c[0]-1)/(c[2]+c[3]*256);//计算记录数
   c[0]=records%256; //c[0]~c[3]计算第5~8字节的值
   c[1]=(records-c[3]*256*256*256-c[2]*256*256)/256;
   c[2]=(records-c[3]*256*256*256)/65536;
   c[3]=records/256/256/256;
   fseek(fp,-8l,1); //指针指向第5字节
   fputc(c[0],fp); //将c[0]~c[3]写入第5~8字节
   fputc(c[1],fp);
   fputc(c[2],fp);
   fputc(c[3],fp);
   printf("modify the database file successfully!\n");
   fclose(fp);
   return 1;

--------方法三:
将所有的dbf,cdx,dbc文件都删除了。然后用它们的备分文件件,bak,dcx,bdc分别改名,然后,在项目里打开数据库,将里面的所有表移除,删除数据库,再新新建数据库,再将表加入。

2,749

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧