我如何读取dbase文件并应用不同的解码?

时间:2012-10-23 08:38:56

标签: c# character-encoding visual-foxpro dbase

我有一个dbf文件,编码为866代码页(DOS)

使用下面的代码,我正在尝试阅读它。 问题是我得到的字符串就像文件在代码页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 
}

2 个答案:

答案 0 :(得分: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;

http://msdn.microsoft.com/en-us/library/aa975609%28v=vs.71%29.aspx

上有关VFPOLEDB提供商的更多信息

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

答案 1 :(得分: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