4

我有一个以 866 代码页 (DOS) 结尾的 dbf 文件

使用下面的代码,我正在尝试阅读它。问题是我得到的字符串就像文件在代码页 1252 中一样形成。到目前为止,我已经检查了 SO 和其他论坛上的其他问题,但没有运气。寻找关于热门的想法以正确阅读。

var ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\PathtoFile\;Extended Properties=""dBase 5.0""";
var  dBaseConnection = new System.Data.OleDb.OleDbConnection(ConnectionString );

dBaseConnection.Open();

var dBaseCommand = new System.Data.OleDb.OleDbCommand("SELECT * FROM FileName",dBaseConnection);
var dBaseDataReader =  dBaseCommand.ExecuteReader(CommandBehavior.SequentialAccess);


while( dBaseDataReader.Read()){

Encoding.GetEncoding(866).GetString(Encoding.GetEncoding(1252).GetBytes(dBaseDataReader.GetString(2)).Dump();  // Does not help 
}
4

2 回答 2

3

文件来自哪里?同一文件夹中还有哪些其他文件扩展名(例如 FPT/CDX/IDX/NTX)?这应该给我们一个关于它是 VFP 还是 dBase 或 Clipper 或其他东西的线索。

如果它是 Visual Foxpro (VFP) 数据,那么您应该从http://www.microsoft.com/en-gb/download/details.aspx?id=14839安装 VFPOLEDB 提供程序,并使用从http获取的以下连接字符串之一://www.connectionstrings.com/visual-foxpro#vfp-ole-db-provider

数据库容器 (.DBC):

Provider=vfpoledb;Data Source=C:\MyDbFolder\MyDbContainer.dbc;Collating Sequence=machine;

空闲表目录:

Provider=vfpoledb;Data Source=C:\MyDataDirectory\;Collating Sequence=general;

连接到单个 DBF 文件:

Provider=vfpoledb;Data Source=C:\MyDataDirectory\MyTable.dbf;Collating Sequence=machine;

有关 VFPOLEDB 提供程序的更多信息,请访问http://msdn.microsoft.com/en-us/library/aa975609%28v=vs.71%29.aspx

出于兴趣,您怎么知道它被编码为代码页 866?Visual Foxpro DBF 中偏移量 29 处的字节存储代码页标记。请参阅http://msdn.microsoft.com/en-us/library/aa975386%28v=vs.71%29.aspx

于 2012-11-07T14:06:39.580 回答
0

我没有看到您获得 1252 编码数据的证据。您的代码尝试从 1252 转换为 866 代码页失败。因此它不在 1252 代码页中。我目前修复了驱动程序返回非单字节字符串的问题。可能也是你的问题。

解决方案:

检查 HKLM\SOFTWARE\Microsoft\Jet\4.0\Engines\Xbase\BDE 键的值。它必须是 2。如果不存在或密钥不存在(这是我的情况),请创建 DWORD 参数并将其设置为 2。

您可以在此处找到有关此密钥的更多信息:http: //support.microsoft.com/kb/307455/en-us

于 2013-02-05T11:44:40.140 回答