Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Связь с dbf III в ACCESS или MS Visual Studio 2005 / 15 сообщений из 15, страница 1 из 1
16.01.2008, 09:12
    #35064321
Mdel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь с dbf III в ACCESS или MS Visual Studio 2005
Понимаю, что подобных вопросов было много и, возможно, постю не в ту ветку, но все таки...

Имеется старая старая база, написана еще на FoxPro 2.6. и dbf III вер. в кодировке 866

Как пример, таблица Test
Код: plaintext
1.
2.
Code Name             Value
 001    Постановление     0125 

Проблема:
1. Если я создаю связь в Access(через ODBC), то данные поля Name выводятся в виндовой кодировке, соответственно кракозябры. Как Access можно заставить понять что надо кодировку другую выбирать. Через BDE администратора уже поменял LangDriver на "dBASE RUS cp866". Не помогло. В реестре параметры Jet менял. Не помогло... Что можно сделать?
2. Если отказаться от Access и делать все в Visual Studio 2005 (C#), то возникает проблема другого рода. Данные отображаются в корректном виде, но я не могу создать параметризированный запрос. При создании запроса вида
Код: plaintext
1.
SELECT `VID`, `ARTICLE`, `KOL`, `NAME`, `COD` FROM `RIGTHS` where name=?
выдается предупреждение Invalid Precision Value. Связь происходит через "Driver do Microsoft DBASE". При связи через "MS Visual FoxPro Driver" данные опять отображаются в неверной кодировке...

Помогите советом, вроде не тупой, но тут в тупике целый день...

P.S. Суть коннекта в том, что после поиска нужной записи еще необходимо будет обновить некоторые записи. Но это уже вопрос другой..
...
Рейтинг: 0 / 0
16.01.2008, 09:24
    #35064352
Связь с dbf III в ACCESS или MS Visual Studio 2005
MdelПонимаю, что подобных вопросов было много и, возможно, постю не в ту ветку, но все таки...

Имеется старая старая база, написана еще на FoxPro 2.6. и dbf III вер. в кодировке 866

Как пример, таблица Test
Код: plaintext
1.
2.
Code Name             Value
 001    Постановление     0125 

Проблема:
1. Если я создаю связь в Access(через ODBC), то данные поля Name выводятся в виндовой кодировке, соответственно кракозябры. Как Access можно заставить понять что надо кодировку другую выбирать. Через BDE администратора уже поменял LangDriver на "dBASE RUS cp866". Не помогло. В реестре параметры Jet менял. Не помогло... Что можно сделать?
2. Если отказаться от Access и делать все в Visual Studio 2005 (C#), то возникает проблема другого рода. Данные отображаются в корректном виде, но я не могу создать параметризированный запрос. При создании запроса вида
Код: plaintext
1.
SELECT `VID`, `ARTICLE`, `KOL`, `NAME`, `COD` FROM `RIGTHS` where name=?
выдается предупреждение Invalid Precision Value. Связь происходит через "Driver do Microsoft DBASE". При связи через "MS Visual FoxPro Driver" данные опять отображаются в неверной кодировке...

Помогите советом, вроде не тупой, но тут в тупике целый день...

P.S. Суть коннекта в том, что после поиска нужной записи еще необходимо будет обновить некоторые записи. Но это уже вопрос другой..
Не знаю как в С#, но в С++ есть функция CharToOEM(), которая решает вопросы преобразования Win->DOS; также есть функция OEMToChar(), которая решает обратное преобразование.
Посмотри MSDN, RTFM...
...
Рейтинг: 0 / 0
16.01.2008, 09:35
    #35064372
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь с dbf III в ACCESS или MS Visual Studio 2005
досовый фокс частенько игнорирует установку кодовой страницы в заголовке DBF (ставит 0) Структуру заголовка DBF можешь в инете поискать. Там один байт за кодовую страницу отвечает.
Вероятно если поставить кодовую страницу 866 то твоя DBF начнет корректно обрабатываться.

Тут почитай

В файле утилитка для простановки 866 кодовой страницы. Досовская, длинные имена не понимает.
запускать: SET866.EXE MyDBF.DBF
...
Рейтинг: 0 / 0
16.01.2008, 09:46
    #35064394
Mdel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь с dbf III в ACCESS или MS Visual Studio 2005
Dima Tдосовый фокс частенько игнорирует установку кодовой страницы в заголовке DBF (ставит 0) Структуру заголовка DBF можешь в инете поискать. Там один байт за кодовую страницу отвечает.
Вероятно если поставить кодовую страницу 866 то твоя DBF начнет корректно обрабатываться.

Тут почитай

В файле утилитка для простановки 866 кодовой страницы. Досовская, длинные имена не понимает.
запускать: SET866.EXE MyDBF.DBF

Вся фишка в том что я не могу никаким образом менять структуру базы. то есть есть доступ только на изменение ДАННЫХ, но не структуры... база конфиденциальная..
...
Рейтинг: 0 / 0
16.01.2008, 09:47
    #35064399
Mdel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь с dbf III в ACCESS или MS Visual Studio 2005
Станислав С...кий
Не знаю как в С#, но в С++ есть функция CharToOEM(), которая решает вопросы преобразования Win->DOS; также есть функция OEMToChar(), которая решает обратное преобразование.
Посмотри MSDN, RTFM...



Данные преобразование будет происходить только на клиенте или опять же менять в базе туда-сюда?
...
Рейтинг: 0 / 0
16.01.2008, 09:52
    #35064410
Burn
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь с dbf III в ACCESS или MS Visual Studio 2005
MdelВся фишка в том что я не могу никаким образом менять структуру базы. то есть есть доступ только на изменение ДАННЫХ, но не структуры... база конфиденциальная..
Это не изменение структуры это штатное состояние таблицы. Как раз отсуствие признака кодовой страницы это нарушение структуры таблицы.
Либо прийдется при экспорте перегонять позаписьно с конвертацией текстовых полей.
...
Рейтинг: 0 / 0
16.01.2008, 09:59
    #35064438
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь с dbf III в ACCESS или MS Visual Studio 2005
MdelВся фишка в том что я не могу никаким образом менять структуру базы. то есть есть доступ только на изменение ДАННЫХ, но не структуры... база конфиденциальная..
MdelДанные преобразование будет происходить только на клиенте или опять же менять в базе туда-сюда? Если так, то туда-сюда, со всем вытекающим геммороем. Если кодовая страница в заголовке случайно появится, то все сглючит. Надо проверку что CP=0

Давно, когда переводил проги с FPD на VFP. В досовой проге делал следующее - после индексирования и упаковки запускал простановку кодовой страницы, т.к. теряется она похоже после команды PACK, которая по сути создает новую DBF и записывает ее на место старой.

Я бы это изменением структуры не назвал, т.к. FPD ни как не использует кодовую страницу.
...
Рейтинг: 0 / 0
16.01.2008, 10:03
    #35064448
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь с dbf III в ACCESS или MS Visual Studio 2005
1. Создать текстовый файл config.fpw
1.1. В нём написать одну строчку CODEPAGE = AUTO
1.2. Положить рядом с табличками
2. Использовать OLEDB Provider for VFP 9
3. Так же при выборке данных можно использовать CPCONVERT(), хотя чЁ то в ф-ия поддерживаемых провайдером этой ф-ии нет, странно.
...
Рейтинг: 0 / 0
16.01.2008, 10:09
    #35064466
Связь с dbf III в ACCESS или MS Visual Studio 2005
Mdel Станислав С...кий
Не знаю как в С#, но в С++ есть функция CharToOEM(), которая решает вопросы преобразования Win->DOS; также есть функция OEMToChar(), которая решает обратное преобразование.
Посмотри MSDN, RTFM...



Данные преобразование будет происходить только на клиенте или опять же менять в базе туда-сюда?
CharToOEM() / OEMToChar() меняют данные на клиенте. Вы вообще-то в MSDN заглядывали, описание функций читали?

Алгоритм такой:
1. Считать текстовое поле ( Field("<Имя_поля>") ) из Recordset в массив (char *);
2. Массив преобразовать при помощи CharToOEM();
3. Выдать преобразованный массив "клиенту" на просмотр/редактирование...
...
Рейтинг: 0 / 0
16.01.2008, 10:25
    #35064527
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь с dbf III в ACCESS или MS Visual Studio 2005
Станислав С...кийАлгоритм такой:
1. Считать текстовое поле ( Field("<Имя_поля>") ) из Recordset в массив (char *);
2. Массив преобразовать при помощи CharToOEM();
3. Выдать преобразованный массив "клиенту" на просмотр/редактирование...
Только проверку кодовой страницы еще нужно. Без нее при CP=866 в заголовке двойная конвертация пойдет. Я так обычно 866 dbf-ки читаю:
Код: plaintext
1.
2.
3.
4.
	if cpdbf('uslone') =  866 
		lcCost = uslone.COST
	else
		lcCost = cpconvert( 866 ,  1251 , uslone.COST)
	endif
...
Рейтинг: 0 / 0
20.01.2008, 09:07
    #35073847
Mdel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь с dbf III в ACCESS или MS Visual Studio 2005
В общем, ситуация показа следующее:
с кодировкой я поступил как советовал PaulWist, то есть select cpconvert(866,1251, name) from table... А теперь столкнулся с другой проблемой, что при попытке вывести грид, в котором данные берутся из 3 таблиц(1 000 000 строк в первой, 40 000 во второй и 150 в третьей), то время выполнения запроса неприлично длительное... запрос очень простой(примерно):
select a.name, b.vid, c.article from a,b,c where a.id=b.id and a.c_id=c.id and a.name='имя'.

Просьба к пишущим на Visual FoxPro. Где можно взять пример проекта, работающего с dbf файлом, то есть выводящего его на экран+возможность изменить нужное поле по запросу?
...
Рейтинг: 0 / 0
20.01.2008, 09:24
    #35073850
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь с dbf III в ACCESS или MS Visual Studio 2005
Mdel... то время выполнения запроса неприлично длительное... запрос очень простой(примерно):
select a.name, b.vid, c.article from a,b,c where a.id=b.id and a.c_id=c.id and a.name='имя'.
Размеры таблиц какие?
Вероятней всего индексы не используются. Если индекс имеет то же имя файла, то фокс откроет его автоматом (например My.dbf и My.cdx) в остальных случаях dbf должен быть предварительно открыт с явным указанием индекса
Код: plaintext
use MyDBF.dbf index MyCDX.cdx

Если у тебя будет запись в dbf, то при закрытых индексах будет рассогласование DBF и индексов.

Попробуй так
Код: plaintext
select a.name, b.vid, c.article from a inner join b on a.id=b.id inner join c a.c_id=c.id where a.name='имя'

Mdel ... Просьба к пишущим на Visual FoxPro. Где можно взять пример проекта, работающего с dbf файлом, то есть выводящего его на экран+возможность изменить нужное поле по запросу?
Фокс не Access, тут мышекликами много не сделаешь. Рекомендую книжку почитать для начала.
...
Рейтинг: 0 / 0
20.01.2008, 09:44
    #35073856
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь с dbf III в ACCESS или MS Visual Studio 2005
Dima TРазмеры таблиц какие?
Извини, сразу не заметил
Mdel... 1 000 000 строк в первой, 40 000 во второй и 150 в третьей ...
Тогда точно индексы не работают. Нужны индексы по B.ID, C.ID
Если размер A 1 000 000 строк то еще индекс нужен по A.NAME
...
Рейтинг: 0 / 0
21.01.2008, 08:44
    #35074802
Mdel
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь с dbf III в ACCESS или MS Visual Studio 2005
Да вы поймите, что я не в фоксе пишу :) а в visual студии :) В фоксе я писал раньше (2 года назад), уже подзабыл все.

И последний вопрос.
Соединяюсь в студии через MS Visual FoxPro driver for OLE DB, присоединяю dsn - папку, в которой лежат 4 нужных мне dbf-ки. 3 файла построитель видит, 1-в упор не видит (которая на 1 млн записей). индекс файл на месте лежит, через другого провайдера тоже видно этот файл. Почему такое может быть?

P.S. А как заставить C# читать индексы dbf III v.? В опциях ничего такого не вижу, хоть убейте...
...
Рейтинг: 0 / 0
21.01.2008, 09:23
    #35074849
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Связь с dbf III в ACCESS или MS Visual Studio 2005
MdelДа вы поймите, что я не в фоксе пишу :) а в visual студии :) В фоксе я писал раньше (2 года назад), уже подзабыл все.
Это я из первого поста понял. Я идеологию работы пытался объяснить.

MdelP.S. А как заставить C# читать индексы dbf III v.? В опциях ничего такого не вижу, хоть убейте... Еще раз:
Если индекс имеет то же имя файла что и DBF, то фокс (или драйвер) откроет его автоматом (например My.dbf и My.cdx) в остальных случаях dbf должен быть предварительно открыт с явным указанием индекса
У тебя одноименные? ТаблицаНа1МлнЗаписей.dbf и ТаблицаНа1МлнЗаписей.cdx ?

PS А что мешает фокс запустить и выполнить тот-же запрос? Достаточно написать в окне "Command" и enter нажать.
Для смены рабочей папки SET DEFAULT TO "c:\MyFolder\"
Тут мало кто использует MS Visual FoxPro driver for OLE DB, т.к. из фокса оно не надо. Где-то упоминалось что драйвер покривее чем сам фокс работает. Попробуй сначала из фокса добиться чего тебе надо, а потом через драйвер повторить.
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Связь с dbf III в ACCESS или MS Visual Studio 2005 / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]