新制作了一个库存管理软件(c/s),数据库用mssql,客户端用.net开发。
用户在客户端对数据进行查看、添加、导入、编辑、删除、打印等操作。
公司原来的一些数据存储在.dbf文件中,必须在客户端对.dbf文件进行访问,以导入数据。
从网上搜集到关于.dbf文件格式的信息和一部分c语言直接访问.dbf文件的实例,写了一个c#直接访问.dbf的类,支持直接获取.dbf文件的DataSet,获取单个字段信息等。
1。定义.dbf文件头类


































































2。定义.dbf文件字段信息类。


























































3。.dbf文件访问类。使用System.IO.BinaryReader类来读取.dbf文件的二进制数据,然后根据不同的字段类型和数据在.dbf文件里的存储格式对读取到的二进制数据进行解码操作。
(1)。Numeric、float、char型的数据都是明文存储,也只要江二进制数据转换为对应的字符串形式然后转换为相应的数据类型即可。
(2)。Integer型:32位。存储的就是integer类型数据的内存格式,将各个字节的数据移位然后或上即可。
(3)。Double型:64位,不定精度。应该也是double类型数据的内存格式,由于小数位数不确定,使用指针直接获取内存信息。
(4)。Currency型:64位,精度很重要(明确为4位)。读取到的数据.net中用Decimal类型存储。.dbf文件中存储的应该是Currency数据放大10000倍后的long类型数据的内存格式,所以现将文件中的二进制数据读取为对应的int64类型数据,然后缩小10000倍就行。
(5)。Date型:64位。存储的也是明文,前32位为带世纪的年度,后16位为日,剩下的16位为月。
(6)。DateTime型:64位。存储格式与Date型差异就大了。我认为前32位存储的是日期相对于某一日(还没弄清楚是那一日,只是离1年1月1日有1721426天的差距),后32位存储的是时间部分的毫秒数,我就分日期部分和时间部分读取。将日期部分读取为int32数据的天数,减去1721426后,增加到1年1月1日,得到日期部分;读取时间部分的数据为int32的毫秒数,增加到前面获取到的日期上,得到完整的日期。
获取到字段数据后,再对数据进行排错处理。这个主要是针对.dbf中numeric型和float型数据可以只存在空格和"."的现象和boolean型数据存储的是“T”和“F”。
代码如下:


























































































































































