Как мне прочитать файл базы данных и применить другое декодирование?

У меня есть файл 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 ответа

Откуда файл? Какие другие расширения файлов находятся в той же папке (например, FPT/CDX/IDX/NTX)? Это должно дать нам представление о том, является ли это VFP или dBase или Clipper или что-то еще.

Если это данные Visual Foxpro (VFP), вам следует установить поставщика VFPOLEDB с http://www.microsoft.com/en-gb/download/details.aspx?id=14839 и использовать одну из следующих строк подключения, взятых из http://www.connectionstrings.com/visual-foxpro.

Контейнер базы данных (.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? Байт со смещением 29 в DBF Visual Foxpro хранит метку кодовой страницы. См. http://msdn.microsoft.com/en-us/library/aa975386%28v=vs.71%29.aspx

Я не вижу доказательств того, что вы получили 1252 закодированных данных. Ваш код пытается выполнить кодовую страницу с 1252 по 866 не удалось. Таким образом, это не в 1252 кодовой странице. В настоящее время я исправил проблему, когда драйвер возвращал не однобайтовую строку. Может быть, это тоже ваша проблема.

Решение:

Проверьте значение ключа HKLM\SOFTWARE\Microsoft\Jet\4.0\Engines\Xbase\BDE. Должно быть 2. Если нет или ключ не существует (это был мой случай), создайте параметр DWORD и установите его равным 2.

Более подробную информацию об этом ключе вы можете найти здесь: http://support.microsoft.com/kb/307455/en-us

Другие вопросы по тегам