Как мне прочитать файл базы данных и применить другое декодирование?
У меня есть файл 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