Чтение таблицы Foxpro, используемой другим приложением

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

Когда это произойдет, получите исключение

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

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

PS: я использую VS 2008 С# для доступа к нему. Моя строка подключения выглядит так: "Provider=VFPOLEDB.1;Data Source=C:\data\"

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


person Andres    schedule 27.07.2009    source источник


Ответы (5)


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

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 соответствует стандарту среды выполнения.

Рик Шуммер VFP MVP

person Rick Schummer    schedule 28.07.2009
comment
Спасибо, Рик. Я запускаю свое приложение параллельно с основным приложением, которое, кажется, написано на VB. Я использую Visual Foxpro 9.0 только для просмотра структуры таблиц и выполнения некоторых запросов. - person Andres; 28.07.2009
comment
Хорошо, когда вы открываете файлы в Visual FoxPro, просто убедитесь, что эксклюзивная настройка отключена. Это не означает, что приложение VB запрограммировано на предоставление общего доступа. - person Rick Schummer; 29.07.2009

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

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

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

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

person Alex Martelli    schedule 28.07.2009
comment
Как вы можете отсоединить DBF, если другая программа заблокировала таблицу либо с помощью монопольного использования, либо с помощью команды FLOCK()? Если файл используется другой программой, он не позволит открыть или отсоединить его. - person Rick Schummer; 28.07.2009
comment
Я не знаю, использует ли Foxpro рекомендательную блокировку (которую вы можете игнорировать в CopyFile) или нерушимую (которую вы не можете), но даже в последних случаях могут быть обходные пути (например, чужие файловые системы, которые можно настроить на НЕ применяйте нерушимые замки), всегда с оговорками, которые я уже дал, конечно. - person Alex Martelli; 28.07.2009
comment
Спасибо за идеи. Проблема в том, что у меня есть коммерческое программное обеспечение для розничной торговли, написанное третьей компанией, и оно использует эту дерьмовую схему базы данных. Я пишу вспомогательное программное обеспечение, и в этом случае у меня не было выбора, кроме доступа к базе данных foxpro. - person Andres; 28.07.2009
comment
Вы можете копировать файлы, но всегда есть шанс, что файл окажется в середине транзакции обновления. Вы также должны скопировать весь набор файлов, потому что таблица не может быть открыта без базы данных. - person Rick Schummer; 29.07.2009

Рик прав. Ваши настройки Foxpro по умолчанию дают сеансу Foxpro исключительные права на любую таблицу, открытую командой "use".

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

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

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

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

use in 0 exclusive <table-file-path>

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

use in 0 shared <table-file-path>

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

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

or

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

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

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

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

foxpro <program-name>.prg

Это может быть файл .bat или .cmd, который запускается общим планировщиком.

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

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

Удачи.

person jetimms    schedule 03.08.2009

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

person DRapp    schedule 29.07.2009

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

person user180011    schedule 28.09.2009