Помогите с таким вопросом. Подключаюсь к DBF-ной таблице. В таблице используется кодировка Windows. Вот код которым пытаюсь подключиться и забрать данные из таблицы. Данные забрать удается, но если есть русские символы в ячейках таблицы, то они искажаются. Что делать ???
string _connectionString = "MaxBufferSize=2048;DSN=Файлы dBASE;PageTimeout=5;DefaultDir=" + fi.DirectoryName + "\\;DBQ=" + fi.DirectoryName + "\\;DriverId=533";
OdbcConnection con = new OdbcConnection (_connectionString);
OdbcDataAdapter da = new OdbcDataAdapter();
da.SelectCommand=new OdbcCommand("SELECT ID,VALUE FROM 1SCONST.DBF WHERE OBJID like '% 0' ORDER BY ID",con);
DataTable dt = new DataTable("1SCONST");
try
{
con.Open();
da.Fill(dt);
con.Close();
}
catch(Exception er)
{
sw.WriteLine("Ошибка подключения к БД 1С: " + er.Message);
sw.WriteLine("===============================================");
continue;
}
Здравствуйте, Аноним, Вы писали:
А>День добрый.
А>Помогите с таким вопросом. Подключаюсь к DBF-ной таблице. В таблице используется кодировка Windows. Вот код которым пытаюсь подключиться и забрать данные из таблицы. Данные забрать удается, но если есть русские символы в ячейках таблицы, то они искажаются. Что делать ??? А>
string _connectionString = "MaxBufferSize=2048;DSN=Файлы dBASE;PageTimeout=5;DefaultDir=" + fi.DirectoryName + "\\;DBQ=" + fi.DirectoryName + "\\;DriverId=533";
А>OdbcConnection con = new OdbcConnection (_connectionString);
А>OdbcDataAdapter da = new OdbcDataAdapter();
А>da.SelectCommand=new OdbcCommand("SELECT ID,VALUE FROM 1SCONST.DBF WHERE OBJID like '% 0' ORDER BY ID",con);
А>DataTable dt = new DataTable("1SCONST");
А>try
А>{
А> con.Open();
А> da.Fill(dt);
А> con.Close();
А>}
А>catch(Exception er)
А>{
А> sw.WriteLine("Ошибка подключения к БД 1С: " + er.Message);
А> sw.WriteLine("===============================================");
А> continue;
А>}
Критично чтобы это был ODBC провайдер, или можно использовать OleDB???
Здравствуйте, <Аноним>, Вы писали:
А>Помогите с таким вопросом. Подключаюсь к DBF-ной таблице. В таблице используется кодировка Windows. Вот код которым пытаюсь подключиться и забрать данные из таблицы. Данные забрать удается, но если есть русские символы в ячейках таблицы, то они искажаются. Что делать ???
Чисто теоретически:
Вариант 1 — конвертировать вручную
string s = Encoding.Convert( Encoding.GetEncoding(1251), Encoding.Unicode, valueFromDB);
Здравствуйте, LIN_ast, Вы писали:
LIN>Критично чтобы это был ODBC провайдер, или можно использовать OleDB???
Нет. Можно и через OLE DB
Re[2]: ODBC и DBF
От:
Аноним
Дата:
27.10.05 17:09
Оценка:
Здравствуйте, stasukas, Вы писали:
S>Здравствуйте, <Аноним>, Вы писали:
А>>Помогите с таким вопросом. Подключаюсь к DBF-ной таблице. В таблице используется кодировка Windows. Вот код которым пытаюсь подключиться и забрать данные из таблицы. Данные забрать удается, но если есть русские символы в ячейках таблицы, то они искажаются. Что делать ??? S>Чисто теоретически: S>Вариант 1 — конвертировать вручную S>
S>string s = Encoding.Convert( Encoding.GetEncoding(1251), Encoding.Unicode, valueFromDB);
S>
S>Вариант 2 — использовать dt.Locale
Вариант 1.
Пробовал, но когда получаешь значение из DataRow то значение уже искажено.
Вариант 2.
Пробовал.
dt.Locale = new CultureInfo("ru-RU");
Не помогло. В принципе CultureInfo определяет правила представления значений, а не кодовую страницу.
Здравствуйте, stasukas, Вы писали:
S>Здравствуйте, <Аноним>, Вы писали:
А>>Помогите с таким вопросом. Подключаюсь к DBF-ной таблице. В таблице используется кодировка Windows. Вот код которым пытаюсь подключиться и забрать данные из таблицы. Данные забрать удается, но если есть русские символы в ячейках таблицы, то они искажаются. Что делать ??? S>Чисто теоретически: S>Вариант 1 — конвертировать вручную S>
S>string s = Encoding.Convert( Encoding.GetEncoding(1251), Encoding.Unicode, valueFromDB);
S>
S>Вариант 2 — использовать dt.Locale
Вариант 1.
Пробовал, но когда получаешь значение из DataRow то значение уже искажено.
Вариант 2.
Пробовал.
dt.Locale = new CultureInfo("ru-RU");
Не помогло. В принципе CultureInfo определяет правила представления значений, а не кодовую страницу.
Здравствуйте, Аноним, Вы писали:
А>Помогите с таким вопросом. Подключаюсь к DBF-ной таблице. В таблице используется кодировка Windows. Вот код которым пытаюсь подключиться и забрать данные из таблицы. Данные забрать удается, но если есть русские символы в ячейках таблицы, то они искажаются. Что делать ???
Насколько я знаю, 1С использует DBF файлы в формате foxpro. Соответственно нужно использовать не dBase драйвер, а ODBC драйвер Visual FoxPro или VFPOLEDB провайдер. Если в таблице проставлена code page, то данные должны вернуться в правильной кодировке.
Здравствуйте, algol, Вы писали:
A>Здравствуйте, Аноним, Вы писали:
А>>Помогите с таким вопросом. Подключаюсь к DBF-ной таблице. В таблице используется кодировка Windows. Вот код которым пытаюсь подключиться и забрать данные из таблицы. Данные забрать удается, но если есть русские символы в ячейках таблицы, то они искажаются. Что делать ???
A>Насколько я знаю, 1С использует DBF файлы в формате foxpro. Соответственно нужно использовать не dBase драйвер, а ODBC драйвер Visual FoxPro или VFPOLEDB провайдер. Если в таблице проставлена code page, то данные должны вернуться в правильной кодировке.
Дело в том, что приложение, которое я пишу будет рассылаться на клиентские точки и засталять их ставить там ещё VFPOLEDB не получиться. Необходимо использовать стандартного провайдера или поставляемых MDAC.
Здравствуйте, Дмитрич, Вы писали:
Д>Дело в том, что приложение, которое я пишу будет рассылаться на клиентские точки и засталять их ставить там ещё VFPOLEDB не получиться. Необходимо использовать стандартного провайдера или поставляемых MDAC.
Если используется инсталлятор, то это не проблема. Для VFPOLEDB есть .msm, или можно просто просто скопировать одну dll и зарегистрировать ее.
Кодовая страница таблицы помечается в заголовке DBF, и dBase и FoxPro используют разные коды для одних и тех же кодовых страниц. Поэтому драйвер dBase не поймет кодировки FoxPro. Другой вариант — перекодировать строки непосредственно в запросе. В VFP есть функция CPCONVERT(), возможно такая же или аналогичная есть и в dBase.
Здравствуйте, Аноним, Вы писали:
А>День добрый.
А>Помогите с таким вопросом. Подключаюсь к DBF-ной таблице. В таблице используется кодировка Windows. Вот код которым пытаюсь подключиться и забрать данные из таблицы. Данные забрать удается, но если есть русские символы в ячейках таблицы, то они искажаются. Что делать ???
Если тебе не критичен файл dbf, измени в нем байт кодировки на нужный и все.
Здравствуйте, Andrbig, Вы писали:
A>Здравствуйте, Аноним, Вы писали:
А>>День добрый.
А>>Помогите с таким вопросом. Подключаюсь к DBF-ной таблице. В таблице используется кодировка Windows. Вот код которым пытаюсь подключиться и забрать данные из таблицы. Данные забрать удается, но если есть русские символы в ячейках таблицы, то они искажаются. Что делать ???
A>Если тебе не критичен файл dbf, измени в нем байт кодировки на нужный и все.
1. DBF критична.
2. Я так понимаю, что .fqn там корректно установлен, т.к. программы по просмотру DBF файлов корректно распазнают его кодировку..
Здравствуйте, algol, Вы писали:
A>Здравствуйте, Дмитрич, Вы писали:
Д>>Дело в том, что приложение, которое я пишу будет рассылаться на клиентские точки и засталять их ставить там ещё VFPOLEDB не получиться. Необходимо использовать стандартного провайдера или поставляемых MDAC.
A>Если используется инсталлятор, то это не проблема. Для VFPOLEDB есть .msm, или можно просто просто скопировать одну dll и зарегистрировать ее. A>Кодовая страница таблицы помечается в заголовке DBF, и dBase и FoxPro используют разные коды для одних и тех же кодовых страниц. Поэтому драйвер dBase не поймет кодировки FoxPro. Другой вариант — перекодировать строки непосредственно в запросе. В VFP есть функция CPCONVERT(), возможно такая же или аналогичная есть и в dBase.
Никакой инталяции. Эта утилита для сбора информации для слубы поддержки, а не программный комплекс...
Сейчас сделал подключение через OLEDB
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + fi.DirectoryName + "\\;Extended Properties=DBASE IV;Persist Security Info=False";
Но вся проблема в том, что по умолчанию Jet для DBASE использует OEM кодировку. Если в реестре поменять кодировку с OEM на ANSI то всё работает.
Не хотелось бы делать такие изменения из программы. А как то можно передать в строке подключения, что DataCodePage = ANSI ???