Как прочитать файл 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 
}

person Alexander Taran    schedule 23.10.2012    source источник
comment
Вы изучали использование STRCONV в запросе для возврата значения в Unicode? msdn.microsoft.com/en-US/library /k0yb2181(v=VS.80).aspx   -  person mlorbetske    schedule 23.10.2012
comment
Я сделал сейчас. И все же id мало чем помогает.   -  person Alexander Taran    schedule 23.10.2012
comment
Это действительно версия Dbase 5 или просто файл DBF, который вы пытаетесь принудительно использовать с помощью Jet... вместо использования поставщика Microsoft Visual Foxpro OleDB...   -  person DRapp    schedule 23.10.2012
comment
Хороший вопрос, DRapp, если бы я только знал, как это понять?   -  person Alexander Taran    schedule 23.10.2012
comment
Байт 0 DBF сообщает вам тип файла. См. msdn.microsoft.com/en-us/ библиотека/aa975386(v=vs.71).aspx   -  person Caltor    schedule 06.10.2014


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

person Caltor    schedule 07.11.2012
comment
Во всех моих файлах dBase (.dbf) отсутствует LDID 0xD1 (29 dec). Вопрос - как это переопределить в коде? - person TomeeNS; 20.08.2017
comment
@TomeeNS Я думаю, вы должны опубликовать свой собственный вопрос, иначе это будет довольно запутанно. Обязательно оставьте комментарий здесь со ссылкой на ваш вопрос. - person Caltor; 20.08.2017

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

Решение:

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

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

person Simon Logic    schedule 05.02.2013