Help!!! русские слова в DBF :(
От: Stov  
Дата: 10.03.03 07:55
Оценка:
Привет!
Есть файл DBase III, в котором одна из колонок содержит слова на русском языке. Для считывания этого файла использую Microsoft Jet OLEDB 4.0
При считывании слов на русском языке, строки переводятся в Unicode и содержат произвольные символы (не соответствующие русским кодам в unicode)
Как можно получить оригинальные байты, которые записаны в колонке таблицы.

10.03.03 15:45: Перенесено модератором из '.NET' — ХД
Re: Re: Help!!! русские слова в DBF :(
От: appleru  
Дата: 10.03.03 09:58
Оценка: 2 (1)
Попробуй так:
Если установлен BDE, то в его настройках (configurations/drivers/native/dbase) надо выставить соответствующее значение LANGDRIVER (скорее всего cp866).
Если BDE не установлен, то IMHO лучше пользоваться не jet, а фоксовым ODBC драйвером — DRIVER={Microsoft Visual FoxPro Driver} (для .net надо качнуть с ms и установить native ODBC provider).
При этом в dbf файле надо прописать в 30-й байт зачение 0x65 если данные в OEM кодировке или 0xС9 если в ANSI.

"Stov" <forum@rsdn.ru> wrote in message news:210729@news.rsdn.ru...
From: Stov Оценить

Привет!
Есть файл DBase III, в котором одна из колонок содержит слова на русском языке. Для считывания этого файла использую Microsoft Jet OLEDB 4.0
При считывании слов на русском языке, строки переводятся в Unicode и содержат произвольные символы (не соответствующие русским кодам в unicode)
Как можно получить оригинальные байты, которые записаны в колонке таблицы.
Posted via RSDN NNTP Server 1.4.6 beta
Re[2]: Re: Help!!! русские слова в DBF :(
От: Stov  
Дата: 10.03.03 12:20
Оценка:
Здравствуйте, appleru
Спасибо за совет. Я попытался написать код, который читает массив байтов из колонки DBase файла, однако во время вызова dr.GetChars( 5, 0, buffer, 0, 100 ); генерируется исключение Specified cast is invalid. В чем может быть проблема? Как вы думаете, удастся ли таким способом обойти без ручной модификации DBF файла?


OleDbConnection connD = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fddir + ";Extended Properties=dBase III;");
connD.Open();
OleDbCommand cmd = new OleDbCommand("SELECT * FROM " + fd, connD);

System.Data.OleDb.OleDbDataReader dr = cmd.ExecuteReader( CommandBehavior.SequentialAccess );

while( dr.Read() )
{
    char[] buffer = new char[100];
    dr.GetChars( 5, 0, buffer, 0, 100 );
}
Re[3]: Re: Help!!! русские слова в DBF :(
От: SCS  
Дата: 10.03.03 12:39
Оценка:
Здравствуйте, Stov, Вы писали:
S>Спасибо за совет. Я попытался написать код, который читает массив байтов из колонки DBase файла, однако во время вызова dr.GetChars( 5, 0, buffer, 0, 100 ); генерируется исключение Specified cast is invalid. В чем может быть проблема? Как вы думаете, удастся ли таким способом обойти без ручной модификации DBF файла?

посмотри внимательно (в отладчике), в колонке 5 тип не char[] а, скорее всего, byte[].
методы reader'a типа GetChars, GetBytes работают без преобразования, поэтому метод должен строго соответствовать типу данных в колонке.

а дальше пробуй Encoding.
SCS
Re[4]: Re: Help!!! русские слова в DBF :(
От: Stov  
Дата: 10.03.03 12:48
Оценка:
Здравствуйте, SCS, Вы писали:

SCS>посмотри внимательно (в отладчике), в колонке 5 тип не char[] а, скорее всего, byte[].

SCS>методы reader'a типа GetChars, GetBytes работают без преобразования, поэтому метод должен строго соответствовать типу данных в колонке.
SCS>а дальше пробуй Encoding.

прошу прощения за опечатку — код в предыдущем постинге exception не генерирует. Exception возникает на следующем коде

while( dr.Read() )
{
    int bufferIndex;
    byte[] buffer = new byte[100];
    dr.GetBytes( 5, 0, buffer, 0, 100 );  // !!!! сдесь вылетает
}


для 5 колонки:
type = System.Data.OleDb.NativeDBType
value = {string}

Если же вызвать GetChars, то в массив записываются не правильные символы.
Re[5]: Re: Help!!! русские слова в DBF :(
От: SCS  
Дата: 10.03.03 13:58
Оценка:
Здравствуйте, Stov, Вы писали:
string ss=dr.GetString(5);
// попробуй поиграть кодировками ASCII, UNICODE
byte[] bb=Encoding.ASCII.GetBytes(ss); // <-- в массив
ss=Encoding.Unicode.GetString(bb);     // <-- в строку
SCS
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.