delphi 中如何比较数据表的结构是否一致(DBF). (100分)

  • 主题发起人 主题发起人 yf_zq
  • 开始时间 开始时间
Y

yf_zq

Unregistered / Unconfirmed
GUEST, unregistred user!
在Delphi 中怎样能够核对出两张(Dbf)数据表文件的结构是否一致.
 
直接打开.dbf文件,读出它的结构就可以进行比较了。
这儿有它的格式定义:http://www.csdn.net/Dev/Format/
 
我看了。但很抱歉,不是很明白。
忘在指点。
 
你将.dbf文件用ultraEdit或其它可以查看二进制文件的工具打开,对照着看就要以明白了!
另外上面网站中的内容格式上有些乱,不太容易看,但其内容是正确的!

dbf file structure

字节偏移 内容描述
00 foxbase+, foxpro, dbaseiii+, dbaseiv, no memo - 0x03
foxbase+, dbaseiii+ with memo - 0x83
foxpro with memo - 0xf5
dbaseiv with memo - 0x8b
dbaseiv with sql table - 0x8e

01-03 最后更新日期,格式:yyyymmdd **correction: it is yymmdd**
04-07 文件中的记录数量 (32-bit number)
08-09 文件头中的字节数量(16-bit number)
10-11 记录中的字节数量 (16-bit number)
12-13 保留,用0x00填充
14 数据库标志, 兼容事务
开始事务设置此位为 0x01
结束事务或回卷设置此位为0x00

15 加密标志,加密设置为0x01否则0x00
改变此标志位并不改变记录的加密或解密状态

16-27 多用户环境使用
28 标志索引是否存在 有索引为0x01 否则为0x00
29 语言驱动ID
30-31 保留填充0x00
32-n 字段描述数组
n+1 文件头记录结束标志0x0d

字段数组描述表
字节偏移 描述
0-10 字段名字不足填充 0x00
11 字段类型标志 (见下表)
12-15 记录中字段的偏移量
16 字段长度字节数
17 字段小数位置
18-19 保留
20 数据库工件区ID
21-30 保留
31 此字段是否是索引的一部分,是0x01否则0x00

字段类型标识表
ascii 描述
c character
d date, format yyyymmdd
f floating point
g general - foxpro addition
l logical, t:t,f:f,y:y,n:n,?-not initialized
m memo (stored as 10 digits representing the dbt block number)
n numeric
p picture - foxpro addition

注意:所有数据库记录如果其被删除则以删除标记*(0x2a)来开始,否则以空格(0x20)开始
文件结束标志为 0x1a
 
你有示例吗?
谢谢了!
Yf_zq@163.com.
 
如果你不急,我有时间给你写一个!
 
太感谢了.
希望快点.
 
下周一,能行吗?
太感谢了.
 
我简单的做了一个,是控制台应用程序,不全面,只做到将库中的字段读出,不过你可以再补充,如下:
program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
type

Tfield=record //定义字段记录
field_name:array [0..10] of char;//字段名称
field_type:char
//字段类型
field_null:longint
//未定义,空读
field_length:byte
//字段长度
field_decimal_places:byte;//字段的小数位数,如果类型是数值型的话有用
field_reserved_1:word
//保留
field_wordarea_id:byte
//工作区ID
filed_reserved_2:array[0..9] of byte;//保留
field_index:byte
//索引标识
end;

var
i:integer;
inf,outf:string;
sf,df:file of byte;
read1,read2:byte;
read3,read4:string;
field:tfield;
fno1,fno2:word;

begin
// Insert user code here
if ParamCount<>2 then begin
writeln('Input source filename(*.dbf):');
readln(inf);
writeln('Input destination filename(*.dbf)');
readln(outf);
end else begin
inf:=ParamStr(1);
outf:=ParamStr(2);
end;
//上面这段代码是为了取得要比较的数据库文件名字
Assign(sf,inf);
assign(df,outf);
{$I-}
reset(sf);
if IOResult<>0 then begin
writeln(#07#07,'读源文件出错!');
exit
end;
reset(df);
if IOResult<>0 then begin
writeln(#07,#07,'读目的文件出错!');
exit;
end;
{$I+}
read(sf,read1);
read(df,read2);
if read1<>read2 then begin
writeln('源文件和目的文件的文件类型不一致');
exit;
end else case read1 of
03:writeln('foxbase+, foxpro, dbaseiii+, dbaseiv, no memo ');
$83:writeln('foxbase+, dbaseiii+ with memo ');
$8b:writeln('dbaseiv with memo ');
$8e:writeln('dbaseiv with sql table');
$f5:writeln('foxpro with memo ')
else begin
writeln('不可识别的文件类型');
exit;
end;
end;

seek(sf,8);
seek(df,8);
blockread(sf,fno1,2);//读出文件中文件关的长度
blockread(df,fno2,2);
if fno1<>fno2 then
writeln('两个文件不相同');//由于文件头长度不同所以可以肯定文件不同

fno1:=(fno1-32) div 32;//求文件中的字段数量个数
writeln('文件中的字段数量为',fno1);

seek(sf,32);//将文件指针定位到第一个字段处
seek(df,32);

for i:=1 to fno1 do begin //循环读源文件中的每一个字段信息
blockread(sf,field,32);
writeln('第 ',i,' 个字段名是?,field.field_name);
writeln('第 ',i,' 个字段类型是 ',field.field_type);
writeln('第 ',i,' 个字段长度是 ',field.field_length);
//可以取出其它的信息或将这些信息保存到另外的地方
end;

readln;
close(sf);
close(df);

end.
 
程序读出的变量read1(文件类型)等于48(Vfp6.0).
 
后退
顶部