我有几个需要能够查询的第三方生成的 DBF 文件。我遇到了麻烦,因为所有列类型都被定义为字符,但其中一些字段中的数据实际上包含二进制数据。如果我尝试使用 OleDbDataReader 将这些字段作为字符串或字符数组以外的任何内容读取,我会抛出 InvalidCastException,但我需要能够将它们作为二进制值读取,或者至少在读取它们之后进行转换/转换. 实际包含文本的列按预期返回。
例如,第一列定义为长度为 2 个字节的字符字段,但该字段包含一个 16 位整数。
我编写了以下测试代码来读取第一列并将其转换为适当的数据类型,但值不正确。
数据库的第一行在第一列中的值为 17365 (0x43D5)。运行以下代码,我最终得到的是 17215 (0x433F)。我很确定这与使用 ASCII 编码从数据读取器返回的字符串中获取字节有关,但我不确定将值转换为我需要的格式的另一种方法,除此之外编写我自己的 DBF 阅读器并完全绕过 ADO.NET,除非我绝对必须这样做,否则我不想这样做。任何帮助将不胜感激。
byte[] c0;
int i0;
string con = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\ASTM;Extended Properties=dBASE III;User ID=Admin;Password=;";
using (OleDbConnection c = new OleDbConnection(con))
{
c.Open();
OleDbCommand cmd = c.CreateCommand();
cmd.CommandText = "SELECT * FROM astm2007";
OleDbDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
c0 = Encoding.ASCII.GetBytes(dr.GetValue(0).ToString());
i0 = BitConverter.ToInt16(c0, 0);
}
dr.Dispose();
}