Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе? / 16 сообщений из 16, страница 1 из 1
21.08.2009, 15:59
    #36157287
villy_ss
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
Прошу прощения, что запостил это сообщение в данный топик тоже (помимо топика про C#).
Дело в том, что данный вопрос на стыке C# и FoxPro. И судя по всему не самый простой вопрос.
Специалисты по FoxPro - может подскажите, куда думать?


Ситуация следующая: имеется DBF-файл размером 120 Мб расположенный на сетевом диске.
По нему надо сделать банальный селект типа такого
Select * from table where columnname =’1111111111’.

Этот селект выполняется порядка 15 секунд.
Если DBF’ку положить локально, то селект занимает в среднем 4 секунды.
Если еще и проиндексировать по полю, используемому в WHERE, то время его отработки уменьшается раз в двадцать.
Хорошо. Если локально.
Стоит только проиндексировать DBF’ку в сетке, как никакого прироста скорости не наблюдается. Т.е. эта зараза видимо копирует все на клиентскую машину и там делает выборку. Какая именно зараза?
Пробовал пользовать три провайдера:
1. стандартный System.Data.OleDb (Provider=Microsoft.Jet.OLEDB.4.0)
2. VFP9 (Provider='VFPOLEDB.1')
3. ODBC
Первый и последний вообще индексов не понимают (скорость работы с индексом не увеличивается даже на локальной DBF’ке). Второй понимает только локальный индекс(стало быстрее в 20 раз).

Так может и нельзя быстрее-то?
Однако сам VFP6 (у меня шестерка) выборку из проиндексированного файла в сети делает без всякой задержки. Значит можно, только как?

Как можно заставить провайдер не копировать весь объем на локальную машину?
Или из C# нельзя? Только «родным» синтаксисом из FoxPro?

Вообще я слабо знаком с DBF. Поэтому может что-то не так делаю. Например, я не знаю какой именно версией FoxPro был сделан этот 120-мегабайтный DBF-файл. Судя по тому, что в нем DOS-кодировка, то видимо в какой-то старой версии FoxPro. Я же индексирую его через FoxPro 6 версии (что нашел  ). Может быть в этом может быть проблема?

Итого: можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?

Заранее спасибо!
...
Рейтинг: 0 / 0
21.08.2009, 16:08
    #36157316
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
villy_ss Судя по тому, что в нем DOS-кодировка, то видимо в какой-то старой версии FoxPro.
...
Может быть в этом может быть проблема?
Именно. Скопируйте его со сменой кодовой страницы и OLEDB Provider сможет подцепить индекс.
...
Рейтинг: 0 / 0
21.08.2009, 16:49
    #36157429
villy_ss
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
Вы правы!

Открываю файл VFP6, он говорит, что кодировка на файле не стоит, а надо поставить.
Раньше я выбирал DOS-кодировку, чтобы текст был читабельный.
Теперь же установил Win1251 - отображаются крякозяблы в колонке с русским текстом (индексировал по другой колонке, где нет кириллицы), зато подхватился индекс, лежащий рядом с файлом DBF на сетевом ресурсе! Также работает, если отменить смену кодировки, которую предлагает VFP6.

Однако подхватил индекс не OleDb (Provider=Microsoft.Jet.OLEDB.4.0), а VFP9 (Provider='VFPOLEDB.1'). ODBC тоже подкачал – не смог пдхватить.

Спасибо большое!
...
Рейтинг: 0 / 0
21.08.2009, 17:13
    #36157505
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
villy_ssОднако подхватил индекс не OleDb (Provider=Microsoft.Jet.OLEDB.4.0), а VFP9 (Provider='VFPOLEDB.1').Последний и есть VFP OLEDB Provider.
...
Рейтинг: 0 / 0
24.08.2009, 11:18
    #36159403
villy_ss
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
Черт, теперь траблы с кодировкой.

При работе через System.Data.OleDb (Provider=Microsoft.Jet.OLEDB.4.0) не подхватывались индексы, зато не было проблем с кодировкой.
При использовании VFP9 (Provider='VFPOLEDB.1') стали подхватываться индексы, но появились проблемы с кодировкой:

--- Test from dbf (Microsoft.Jet.OLEDB) ---
SNAME=ГОРУЛЕВ,

--- Test from dbf (VFPOLEDB.1) ---
SNAME=???"<:'

,

Т.е. через Microsoft.Jet.OLEDB отображается «Горулев», через VFPOLEDB.1 – совсем даже не то, что надо.

Если открыть эту БД через VFP6 выдается предупреждение, что кодовая страница не установлена. Предлагает установить. Если выбрать MS-DOS (866), то русский текст отображается нормально. Если Windows или нажать Отмена, то крякозяблы.

Строка подключения:
conn = string.Format(@"Provider='VFPOLEDB.1';Data Source='{0}';Extended Properties=dBase IV", path);

Пробовал так:
@"Provider='VFPOLEDB.1';Data Source='{0}';Extended Properties=dBase IV;CODEPAGE=866;"

@"Provider='VFPOLEDB.1';Data Source='{0}';Extended Properties=dBase IV;Collating Sequence=RUSSIAN"

Ничего не помогает.
Но ведь в System.Data.OleDb (Provider=Microsoft.Jet.OLEDB.4.0) проблем не было!
Не в ручную же перекодировать…
...
Рейтинг: 0 / 0
24.08.2009, 15:14
    #36159995
villy_ss
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
Про 29 байт читал. Но нет возможности у меня его править. DBF'ки не мои...
...
Рейтинг: 0 / 0
24.08.2009, 15:20
    #36160015
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
villy_ssПро 29 байт читал. Но нет возможности у меня его править. DBF'ки не мои...Делаешь с них копии и работаешь.
...
Рейтинг: 0 / 0
25.08.2009, 08:53
    #36160934
villy_ss
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
Я бы с радостью :)
Дело в том, что есть большое количество DBF'ок на сетевом диске, которые в общем случае обновляются каждый день. Каталог с DBF’ками с правами только на чтение. С этими DBF’ками может работать несколько (много) экземпляров приблуд, которые я собственно и хочу научить эффективно работать с DBF’ками. Копировать DBF’ки на каждую машину и менять там 29 байт не эффективно. Клиентов много и объем DBF’ок большой.

Выбираю пока из двух вариантов:
1. Использовать провайдер Visual Fox Pro 9 (Provider='VFPOLEDB.1'), чтобы умел работать с индексами. Но при этом использовать ручное перекодирование.

2. Заюзать Оракл, который там уже развернут для других целей. Т.е. при старте приложения морда определяет, что DBF’ка изменилась (по хэшу например) и всасывает эту DBF’ку в Оракл с помощью BulkCopy. Файлик весов 120 Мб усасывается в Оракл примерно за минуту. Как бы терпимо, но вот если этих файликов хотя бы пять? Долго. Создать индекс на DBF’ку, если его нет, как бы значительно быстрее и пользовать потом напрямую DBF’ки…
...
Рейтинг: 0 / 0
25.08.2009, 10:19
    #36161069
reware
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
villy_ssПро 29 байт читал. Но нет возможности у меня его править. DBF'ки не мои...
Чего-то не понял. Ну ладно, DBF не ваши, но прога-то ваша. Ну и вставить в ней исправление 29 байта. Или в них вообще писать запрещено ?
...
Рейтинг: 0 / 0
25.08.2009, 10:44
    #36161144
villy_ss
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
Нельзя в них писать. И доступа нет.
А грузить в Оракл тоже не вариант в общем случае однако. Т.к. одну-то большую DBF'ку можно за минуту грузануть. А если их несколько? Это сейчас надо подключить только одну. Что будет со временм не понятно. Так что нужно докручивать вариант с индексами.
...
Рейтинг: 0 / 0
25.08.2009, 10:44
    #36161146
-=AlexiS=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
villy_ssВыбираю пока из двух вариантов:
1. Использовать провайдер Visual Fox Pro 9 (Provider='VFPOLEDB.1'), чтобы умел работать с индексами. Но при этом использовать ручное перекодирование.
2. Заюзать Оракл, который там уже развернут для других целей. Т.е. при старте приложения морда определяет, что DBF’ка изменилась (по хэшу например) и всасывает эту DBF’ку в Оракл с помощью BulkCopy. Файлик весов 120 Мб усасывается в Оракл примерно за минуту. Как бы терпимо, но вот если этих файликов хотя бы пять? Долго. Создать индекс на DBF’ку, если его нет, как бы значительно быстрее и пользовать потом напрямую DBF’ки…

Может не стоит использовать Оракл ?
Возможно проще сделать похожую систему, но на тех-же самых dbf или лучше сделать свою базу схожей структуры , но уже объединённую в контейнер .
Создадите свою базу ,в win-1251 ,которая будет нормально понимать индексы и нормально показывать кирилицу.При необходимости создадите свои индексы, которые обеспечат оптимизацию ваших запросов.
Так-же проверять изменились данные или нет и закачивать при необходимости.
Если обновление этих самых free dbf происходит "регулярно" , можно написать отделную программу - конвертер , которая будет запускаться после обновления набора свободных табличек.
...
Рейтинг: 0 / 0
25.08.2009, 11:30
    #36161271
ВМоисеев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
>villy_ss, 21 авг 09, 15:59 [7567819]
>Итого: можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?

Рассмотри такой вариант.
1. Используя WCF создаешь сервис, реализующий функции работы с данными.
2. Располагаешь его на сетевом компе, где лежат DBF.
3. Из клиентской части приложения обращаешься к удаленному сервису (а-ля сервер приложения), а не к DBF.

С уважением, Владимир.
...
Рейтинг: 0 / 0
25.08.2009, 12:59
    #36161524
Sergey Ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
Почитайте тут . Это самый простой способ это сделать, впрочем Вам выше уже советовали. Особое внимание обратите на web.config - как раз culture & globalization будут определять вид отображения.

Если Вам нельзя установить эти параметры глобально, то тогда можно их установить для конкретной Web page for ASP.NET или формы в WinForm...

Good luck!

P.S. А в перекодировке "вручную" ничего сложного и нет В C# есть все для этого.
...
Рейтинг: 0 / 0
25.08.2009, 15:24
    #36162010
villy_ss
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
Большое спасибо всем откликнувшимся!

Нет возможности поднять вебсервис на той машине, где лежат DBF'ки. Закрытый сегмент и все тут. Безопасность, бла-бла-бла. Можно эти DBF'ки только читать и при необходимости индексы создавать/пересоздавать. Все.

А Оракл развернут на другой машине. Его можно пользовать. Только вот смысла особого нет...

Да, на машине с Оракл можно развернуть "свою" структуру БД на DBF'ках. Однако хрень редьки не слаще: что в Оракл импортить, что копировать DBF'ки на другую машину - требуется время. Хотя в случае копирования, это время меньше конечно. Но поди объясни заказчику, зачем это надо :)
Типа работают же имеющиеся проги с этими DBF'ками? Работают (сделаны на FoxPro 2.5 и клиппер). Значит можно "быстро" пользовать имеющиеся DBF'ки? Можно. Все остальное значения не имеет. Он, заказчик, не хочет париться из-за проблем разработчика. И он в общем то прав.

Есть еще вариант написать все реально на фоксе и пользовать его как OLE-сервер. Так вроде можно...

Или вручную перекодировать.
Однако тут еще "неожиданно" встает вопрос не только про поддержку cdx-индексов, но ntx-индексов (клиппер). Причем не только читать такие DBF'ки, но и создавать и пересоздавать такие индексы. С созданием cdx-индексов я думаю справиться можно через провайдера VFP9. Но вот ntx-индексы! Я в шоке :) Их даже сам VFP6 (среда разработки) не понимает...
...
Рейтинг: 0 / 0
25.08.2009, 16:54
    #36162264
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
villy_ssМожно эти DBF'ки только читать и при необходимости индексы создавать/пересоздавать. Все.
Если индексировать дает, значит и 29-й байт править можно.

villy_ss Работают (сделаны на FoxPro 2.5 и клиппер).
FPD вообще кодовые страницы игнорирует. Считает что DBF в его 866 кодировке и не парится. А в 29-й байт пишет 0 - кодировка не указана.

villy_ssЕсть еще вариант написать все реально на фоксе и пользовать его как OLE-сервер. Так вроде можно...
Без исправления 29 байта не заработает.

villy_ssОднако тут еще "неожиданно" встает вопрос не только про поддержку cdx-индексов, но ntx-индексов (клиппер).

NTX вроде как кроме клиппера никто не понимает.

А что касается исправления 29-го байта, то FoxPro 2.5 портит его (сбрасывет в 0) только при выполнении команды PACK (физическое удаление записей помеченных на удаление). И то в случае если были записи помеченные на удаление, т.к. при этом DBF-ка пересоздается заново.
...
Рейтинг: 0 / 0
26.08.2009, 18:30
    #36164738
Приземлятор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
villy_ss, через linked из оракла не пробовал ?
...
Рейтинг: 0 / 0
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе? / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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