C# и DBF формата dBase IV
От: Аноним  
Дата: 08.12.07 07:45
Оценка:
Господа, прошу Вашей помощи, ибо сам уже отчаялся найти верное решение, и утонул в куче форумов и статей, которыми "щедро" поделился theГугль...

Задача: нужно программно создать файл формата DBF dBase III — dBase IV (НЕ ФОКСПРО) со следующими аттрибутами:
1. кодировка cp1251
2. размер одного из полей создаваемой "таблицы" должен быть типа Numeric (20,2)

Проблема: поискав в нете схожие решения, я понял, что все они сводятся, так или иначе, к использованию драйверов VFP Ole DB/ODBC, так как родные Jet ISAM вообще неправильно интерпретируют размерность поля для Numeric, а "семейство" Microsoft dBase Driver (*.dbf) вообще непонимают задание размерности для этого типа (ровно как и для float), и ВСЕГДА создают дефолтовую размерность (20, 5) что не допустимо в данном случае.

С использованием VFP Ole DB/ODBC этих проблем не существует, НО, они "рисуют" форматы Fox Pro, что мне совершенно ненужно...
(http://www.sql.ru/forum/actualthread.aspx?tid=150240
http://www.gotdotnet.ru/Forums/Data/428451.aspx
http://www.gotdotnet.ru/Forums/Data/398319.aspx
и так далее)

Сейчас делаю так:
OdbcConnection conn = new OdbcConnection();
OdbcCommand cmd;

 conn.ConnectionString = string.Format("DRIVER={{Microsoft dBase Driver (*.dbf)}};datasource=dBase Files;FIL=dBase IV;
 DefaultDir={0};DBQ={0};CollatingSequence=International", exportPath);
 conn.Open();
 cmd = conn.CreateCommand();
 cmd.CommandText = string.Format(@"CREATE TABLE [{0}] (itemName Char(40), itemValue Numeric,  itemInfo Char(150))", fileName);
 
cmd.ExecuteNonQuery();


Код работает, НО:
— невозможно задать требуемую размерность поля itemValue; Оно должно быть Numeric(20,2)
— Значения ItemName и itemInfo записываются в таблицу перекодированные из cp1251 в cp886 (хотя сами значения до записи в таблицу находятся в cp1251... перекодируются драйвером?)

Помогите "победить" проблему, быть может что-то не до конца задано в ConnectionString, или не тот драйвер использую и т.д.

Резюмируя по проблеме:
КАК
1. создать программно таблицу, поле которой должно быть с плавающей запятой (Numeric (20,2))
2. Строковые данные должны записываться не конвертируясь (в данном случае в cp1251)
3. Результатирующий файл должен быть формата dBase III/dBase IV


Друзья, помогите пожалуйста найти верное решение!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.