2009-07-27 6 views
0

Я пишу небольшое программное обеспечение, которое будет частью существующего приложения, которое использует таблицы dbf foxpro. Мое приложение просто читает 2 таблицы, заполняет набор данных и закрывает соединение, довольно быстро и просто. Он работает до тех пор, пока не будет использована одна из этих таблиц или сам foxpro (когда таблица открыта) или основным приложением, когда она обращается к этой таблице.Прочитать таблицу Foxpro, используемую другим приложением

Когда случается получить исключение

ех = { "Не удается открыть файл C:. \ Data \ myFile.dbf"} ErrorCode = -2147217865

Можно ли указать, что я хочу доступ к нему только для чтения, а не для редактирования?

PS: Я использую VS 2008 C# для доступа к нему. Моя строка подключения выглядит следующим образом: «Provider = VFPOLEDB.1; Источник данных = C: \ Data \»

Большое спасибо

ответ

3

Я делаю предположение, когда вы ссылаетесь на «FoxPro», вы подразумеваете, что кто-то использует FoxPro 2.6 для DOS или Windows или Visual FoxPro (любая версия). Если это так, убедитесь, что пользователь использует следующую команду в Command Окно

SET EXCLUSIVE OFF 

Или они могут открывать каждую таблицу и включать предложение SHARED для каждой команды USE.

Если вы имеете в виду приложение, разработанное в FoxPro, которое работает с данными, у вас немного более сложная ситуация, потому что приложение может быть спроектировано как однопользовательское и иметь код SET EXCLUSIVE ON в коде.Лучший выстрел у вас есть в этом случае, чтобы попытаться изменить существующий Config.FP или CONFIG.FPW (в зависимости от версии) и добавив строку:

EXCLUSIVE = OFF 

Или вы можете создать файл, если он не существует , Если это не сработает, вам понадобится исходный код приложения, чтобы изменить его, чтобы он не открывал только таблицы.

Что касается использования драйвера VFP OLE DB с вашей программой на C#, вы можете включить файл Config.FPW в папку с EXCLUSIVE = OFF, и он гарантирует, что вы откроете файлы в режиме общего доступа, на всякий случай вы пытаетесь использовать исключительно. Это маловероятно, так как версия выполнения не отключена по умолчанию, а драйвер OLE DB соответствует стандарту времени исполнения.

Рик Schummer VFP MVP

+0

Спасибо Рику. Я запускаю свое приложение параллельно с основным приложением, которое, похоже, написано в VB. Я использую Visual Foxpro 9.0 только для просмотра структур таблиц и выполнения некоторых запросов. – Andres

+0

OK, когда вы открываете файлы в Visual FoxPro, просто убедитесь, что эксклюзивная настройка отключена. Это не означает, что приложение VB запрограммировано на предоставление общего доступа. –

1

вы получаете код ошибки HRESULT 0x80040E37, как искажаются некоторых промежуточных шагов, которые Безразлично не знаю о unsigned int32 - это общая ошибка ODBC для «не может открыть эту таблицу» (обычно из-за неправильной орфографии). Несомненно, Foxpro и libs, которые использует основное приложение, выполняют какую-то «блокировку» - и даже если ODBC разрешает вам указывать, что вы только хотите читать, этому все равно следует отрицать, если какой-либо другой процесс открывает его для записи (два или более процесса, которые просто хотят читать, будут прекрасными, но даже один, желающий писать, должен исключать всех остальных, читателей или писателей).

Если вы не можете временно отсоединить файл .DBF от других приложений, когда вы вкратце прочитали из него, то одним из способов может быть копирование его на другое имя (еще .DBF) и попытка открыть эту копию - делает он работает или все еще терпит неудачу с той же ошибкой? В последнем случае могут быть способы взломать файл, чтобы его «заблокированное состояние» было очищено - до тех пор, пока оно не используется (поскольку копия не будет, пока вам не удастся ее открыть!). После того, как вы прочли, вы хотите удалить копию.

Проблема, этот подход, в то время как это может быть сделано, чтобы работать, не будет полностью надежным: это возможно (если не повезет), что или FoxPro вашего главное приложения может быть в разгаре внесения изменений (вот почему они блокируют его, чтобы быть в безопасности, они МОГУТ вносить изменения), и изменения могут быть частично, но не полностью привязаны к диску в тот момент, когда вы выполняете копию. У вас есть способ проверить, являются ли данные, которые вы читаете, разумными или искаженными? Если вы можете сказать, что это испорчено, вы можете просто попробовать снова прочитать (надеясь, что сохранение новых данных на диске было завершено), но если вы не можете сказать, что это действительно crapshoot ... :-(

I угадать урок, который нужно удержать, заключается в том, что некоторые способы сохранения данных - это просто НЕ все, что подходит для многозадачных целей - не забудьте использовать более надежный способ в следующий раз при разработке любого вида сохранения данных для своих программ!

+0

Как вы можете отсоединить DBF, если другая программа имеет блокировку на столе либо через эксклюзивное использование, либо с помощью команды FLOCK()? Если файл используется другой программой, он не позволяет открывать или отрываться. –

+0

Я не знаю, использует ли Foxpro консультативную блокировку (которую вы могли бы игнорировать в CopyFile) или нерушимый (что вы не могли), но даже в последних случаях могут быть обходные пути (например, «чужие» файловые системы, которые могут быть настроен, чтобы НЕ применять нерушимые блокировки), всегда с предостережениями, которые я уже дал, конечно. –

+0

Благодарим вас за идеи. Проблема в том, что у меня есть коммерческое розничное программное обеспечение, написанное третьей компанией, и оно использует эту схему дерьма базы данных. Я пишу вспомогательное программное обеспечение, и в этом случае у меня не было выбора, кроме доступа к базе данных foxpro. – Andres

0

Помимо Рикс комментарий на SET EXCLUSIVE OFF в фактическом применении Foxpro. Существуют несколько случаев, когда необходима настоящая блокировка файла, например, изменение структуры, упаковка базы данных (удаление записей, помеченных для удаления), восстановление индексов. Если какой-либо из них является основой для заблокированного файла, то даже копирование не поможет, поскольку вы не сможете получить дескриптор файла, и/или результат копирования может быть не синхронизирован, тогда ваш запрос может терпят неудачу или дают другие ложные результаты.

1

Rick правильный. Ваши настройки Foxpro дефолтны, чтобы предоставить эксклюзивным правам сессии Foxpro любую таблицу, открытую командой «use».

Когда вы открываете стол, в то время как приложение VB работает, вы спотыкаетесь друг над другом.

Я предполагаю, что вы дважды щелкаете DBF-файлами в проводнике Windows и открываете их, а не используете команду «use» в Foxpro для просмотра таблиц. Если вы хотите сделать это именно так, то (в VFP 9) закройте все сеансы, но один из VFP. Откройте Инструменты-> Параметры-> Вкладка «Данные» и снимите флажок «Открыть эксклюзив». Теперь закройте эту сессию. Это сохранит настройки. В следующий раз, когда вы дважды щелкните DBF/DBC, он откроет все таблицы с «общим» доступом.

В противном случае, чтобы получить доступ к таблицам внутри VFP с помощью команды "использовать", сделайте следующее:

Для эксклюзивного доступа:

use in 0 exclusive <table-file-path> 

Для общего доступа:

use in 0 shared <table-file-path> 

Вы можете также дайте ему флаг noupdate, чтобы сделать его доступным только для чтения. (Безопасный способ запроса.)

use in 0 exclusive noupdate <table-file-path> 

или

use in 0 shared noupdate <table-file-path> 

От того, как я понимаю, основная проблема с VB захватить «эксклюзивные» права на базу данных и сбой, когда у вас есть таблица открыта (совместно или иначе.)

Однако это звучит скорее как проблема синхронизации, чем у Foxpro. Предполагая, что у вас нет доступа или разрешения на переписывание приложения VB, единственной альтернативой является поиск времени, в течение которого основное приложение VB не работает (возможно, поздно ночью) и запускает запрос Foxpro. PRG) в планировщике. Запрос может быть скопирован в другой файл, например, предложил Алекс.

Команда для запуска программы Foxpro легко:

foxpro <program-name>.prg 

Это может пойти в .bat или CMD-файл, который находится в ведении общего планировщика.

Однако есть улов: Всегда лучше компилировать .prg изнутри VFP самостоятельно, а не позволять VFP скомпилировать его для вас (что будет, если вы этого не сделаете.) Также, если вы сделаете сменить и не перекомпилировать, VFP будет использовать последнюю скомпилированную версию (просто чтобы назло вам.)

Если вы уже знали это, извините за излишний.

Удачи.

0

Это довольно уродливо, но вы можете попробовать скопировать таблицу через ОС и из приложения Foxpro. ОС может даже иметь возможность обрабатывать копию и задерживать ее, если она находится в середине операции записи из другого процесса. После того, как вы скопируете, если в файл есть обратная ссылка DBC, и вы не можете ее открыть, вам просто нужно БЕСПЛАТНО таблицу. УБЕДИТЕСЬ или БЕСПЛАТНО, моя память не сработает. :) Это все должно быть общим. Лучшим решением является перекомпиляция программного обеспечения для блокировки foxpro, как предлагается, так что оно НЕ является эксклюзивным. Но если вы это сделаете, тогда вам нужно понять, почему это могло быть исключительным, чтобы начать с .. преднамеренного или просто плохого кодирования?

Смежные вопросы