ODBC и DBF
От: Аноним  
Дата: 27.10.05 14:24
Оценка:
День добрый.

Помогите с таким вопросом. Подключаюсь к 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;
}
Re: ODBC и DBF
От: LIN_ast  
Дата: 27.10.05 14:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>День добрый.


А>Помогите с таким вопросом. Подключаюсь к 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???
Re: ODBC и DBF
От: stasukas  
Дата: 27.10.05 15:22
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Помогите с таким вопросом. Подключаюсь к DBF-ной таблице. В таблице используется кодировка Windows. Вот код которым пытаюсь подключиться и забрать данные из таблицы. Данные забрать удается, но если есть русские символы в ячейках таблицы, то они искажаются. Что делать ???

Чисто теоретически:
Вариант 1 — конвертировать вручную
string s = Encoding.Convert( Encoding.GetEncoding(1251), Encoding.Unicode, valueFromDB);

Вариант 2 — использовать dt.Locale
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Now playing: Infected Mushroom — Track 10
Re[2]: ODBC и DBF
От: Аноним  
Дата: 27.10.05 16:50
Оценка:
Здравствуйте, 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 определяет правила представления значений, а не кодовую страницу.
Re[2]: ODBC и DBF
От: Дмитрич Россия  
Дата: 28.10.05 08:57
Оценка:
Здравствуйте, 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 определяет правила представления значений, а не кодовую страницу.
Re: ODBC и DBF
От: algol Россия about:blank
Дата: 28.10.05 09:05
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Помогите с таким вопросом. Подключаюсь к DBF-ной таблице. В таблице используется кодировка Windows. Вот код которым пытаюсь подключиться и забрать данные из таблицы. Данные забрать удается, но если есть русские символы в ячейках таблицы, то они искажаются. Что делать ???


Насколько я знаю, 1С использует DBF файлы в формате foxpro. Соответственно нужно использовать не dBase драйвер, а ODBC драйвер Visual FoxPro или VFPOLEDB провайдер. Если в таблице проставлена code page, то данные должны вернуться в правильной кодировке.
Re[2]: ODBC и DBF
От: Дмитрич Россия  
Дата: 28.10.05 09:32
Оценка:
Здравствуйте, algol, Вы писали:

A>Здравствуйте, Аноним, Вы писали:


А>>Помогите с таким вопросом. Подключаюсь к DBF-ной таблице. В таблице используется кодировка Windows. Вот код которым пытаюсь подключиться и забрать данные из таблицы. Данные забрать удается, но если есть русские символы в ячейках таблицы, то они искажаются. Что делать ???


A>Насколько я знаю, 1С использует DBF файлы в формате foxpro. Соответственно нужно использовать не dBase драйвер, а ODBC драйвер Visual FoxPro или VFPOLEDB провайдер. Если в таблице проставлена code page, то данные должны вернуться в правильной кодировке.


Дело в том, что приложение, которое я пишу будет рассылаться на клиентские точки и засталять их ставить там ещё VFPOLEDB не получиться. Необходимо использовать стандартного провайдера или поставляемых MDAC.
Re[3]: ODBC и DBF
От: algol Россия about:blank
Дата: 28.10.05 10:01
Оценка:
Здравствуйте, Дмитрич, Вы писали:

Д>Дело в том, что приложение, которое я пишу будет рассылаться на клиентские точки и засталять их ставить там ещё VFPOLEDB не получиться. Необходимо использовать стандартного провайдера или поставляемых MDAC.


Если используется инсталлятор, то это не проблема. Для VFPOLEDB есть .msm, или можно просто просто скопировать одну dll и зарегистрировать ее.
Кодовая страница таблицы помечается в заголовке DBF, и dBase и FoxPro используют разные коды для одних и тех же кодовых страниц. Поэтому драйвер dBase не поймет кодировки FoxPro. Другой вариант — перекодировать строки непосредственно в запросе. В VFP есть функция CPCONVERT(), возможно такая же или аналогичная есть и в dBase.
Re: ODBC и DBF
От: Andrbig  
Дата: 28.10.05 10:55
Оценка:
Здравствуйте, Аноним, Вы писали:

А>День добрый.


А>Помогите с таким вопросом. Подключаюсь к DBF-ной таблице. В таблице используется кодировка Windows. Вот код которым пытаюсь подключиться и забрать данные из таблицы. Данные забрать удается, но если есть русские символы в ячейках таблицы, то они искажаются. Что делать ???


Если тебе не критичен файл dbf, измени в нем байт кодировки на нужный и все.
Re[2]: ODBC и DBF
От: Дмитрич Россия  
Дата: 28.10.05 11:34
Оценка:
Здравствуйте, Andrbig, Вы писали:

A>Здравствуйте, Аноним, Вы писали:


А>>День добрый.


А>>Помогите с таким вопросом. Подключаюсь к DBF-ной таблице. В таблице используется кодировка Windows. Вот код которым пытаюсь подключиться и забрать данные из таблицы. Данные забрать удается, но если есть русские символы в ячейках таблицы, то они искажаются. Что делать ???


A>Если тебе не критичен файл dbf, измени в нем байт кодировки на нужный и все.


1. DBF критична.
2. Я так понимаю, что .fqn там корректно установлен, т.к. программы по просмотру DBF файлов корректно распазнают его кодировку..
Re[4]: ODBC и DBF
От: Дмитрич Россия  
Дата: 28.10.05 11:36
Оценка:
Здравствуйте, algol, Вы писали:

A>Здравствуйте, Дмитрич, Вы писали:


Д>>Дело в том, что приложение, которое я пишу будет рассылаться на клиентские точки и засталять их ставить там ещё VFPOLEDB не получиться. Необходимо использовать стандартного провайдера или поставляемых MDAC.


A>Если используется инсталлятор, то это не проблема. Для VFPOLEDB есть .msm, или можно просто просто скопировать одну dll и зарегистрировать ее.

A>Кодовая страница таблицы помечается в заголовке DBF, и dBase и FoxPro используют разные коды для одних и тех же кодовых страниц. Поэтому драйвер dBase не поймет кодировки FoxPro. Другой вариант — перекодировать строки непосредственно в запросе. В VFP есть функция CPCONVERT(), возможно такая же или аналогичная есть и в dBase.

Никакой инталяции. Эта утилита для сбора информации для слубы поддержки, а не программный комплекс...
Re: ODBC и DBF
От: Дмитрич Россия  
Дата: 28.10.05 12:42
Оценка:
Сейчас сделал подключение через 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 ???
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.