powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Связь с dbf III в ACCESS или MS Visual Studio 2005
15 сообщений из 15, страница 1 из 1
Связь с dbf III в ACCESS или MS Visual Studio 2005
    #35064321
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. Суть коннекта в том, что после поиска нужной записи еще необходимо будет обновить некоторые записи. Но это уже вопрос другой..
...
Рейтинг: 0 / 0
Связь с dbf III в ACCESS или MS Visual Studio 2005
    #35064352
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
Связь с dbf III в ACCESS или MS Visual Studio 2005
    #35064372
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
досовый фокс частенько игнорирует установку кодовой страницы в заголовке DBF (ставит 0) Структуру заголовка DBF можешь в инете поискать. Там один байт за кодовую страницу отвечает.
Вероятно если поставить кодовую страницу 866 то твоя DBF начнет корректно обрабатываться.

Тут почитай

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

Тут почитай

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

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



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

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

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



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

Алгоритм такой:
1. Считать текстовое поле ( Field("<Имя_поля>") ) из Recordset в массив (char *);
2. Массив преобразовать при помощи CharToOEM();
3. Выдать преобразованный массив "клиенту" на просмотр/редактирование...
...
Рейтинг: 0 / 0
Связь с dbf III в ACCESS или MS Visual Studio 2005
    #35064527
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Станислав С...кийАлгоритм такой:
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
Связь с dbf III в ACCESS или MS Visual Studio 2005
    #35073847
Mdel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем, ситуация показа следующее:
с кодировкой я поступил как советовал 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
Связь с dbf III в ACCESS или MS Visual Studio 2005
    #35073850
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Связь с dbf III в ACCESS или MS Visual Studio 2005
    #35073856
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TРазмеры таблиц какие?
Извини, сразу не заметил
Mdel... 1 000 000 строк в первой, 40 000 во второй и 150 в третьей ...
Тогда точно индексы не работают. Нужны индексы по B.ID, C.ID
Если размер A 1 000 000 строк то еще индекс нужен по A.NAME
...
Рейтинг: 0 / 0
Связь с dbf III в ACCESS или MS Visual Studio 2005
    #35074802
Mdel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да вы поймите, что я не в фоксе пишу :) а в visual студии :) В фоксе я писал раньше (2 года назад), уже подзабыл все.

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

P.S. А как заставить C# читать индексы dbf III v.? В опциях ничего такого не вижу, хоть убейте...
...
Рейтинг: 0 / 0
Связь с dbf III в ACCESS или MS Visual Studio 2005
    #35074849
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
15 сообщений из 15, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Связь с dbf III в ACCESS или MS Visual Studio 2005
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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