powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Open DATABASE EXCL
20 сообщений из 20, страница 1 из 1
Open DATABASE EXCL
    #33362288
_Иван_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странное дело получается....
Вообщем так
1)в майн программе стоит
SET EXCLUSIVE OFF

2)использую приватные датасессии в формах,
там в BeforeOpenTables стоит
SET EXCLUSIVE OFF
итд,

команд
SET DATABASE TO (namebasedan)
open database....
НЕТ!!!
В этих формах в DE
понапиханы таблицы.
открываю, форму, все работает
значит окружение формы контейнер баз нашла
по путям поиска, таблицы открыла-все отобразилось и нашлось

2)значит запустил я майн прогу, завелась ас топ левел форма
*БД нигде точно не открываю!!!
с меню, там в пункте меню стоит запуск формы
на архивацию,там идет такая проверка
на эксклюзивночсть открытия

LPARAMETERS tcnamebasedan
*SET STEP ON
IF !PARAMETERS()=1
MESSAGEBOX("Не передан параметр-название БД")
RETURN
ENDIF
**************************************************************
* Проверяем на предмет незанятости базы данных
LOCAL llZanjato,_Return
llZanjato = .T.
_Return=.f.

DO WHILE llZanjato && крутимся в цикле, пока не освободится БД
TRY
OPEN DATABASE (tcnamebasedan) EXCLUSIVE
&& если база открылась, то работаем
llZanjato = .F.
_Return=.T.
CATCH
IF MESSAGEBOX("Кто-то работает с базой данных. Архивировать базу данных невозможно."+Chr(10)+;
"Закройте все окна, завершите работу программы на других компьютерах и повторите попытку."+Chr(10)+Chr(10)+;
"Повторить попытку архивирования?",5+16+0,"Ошибка") = 4 then
llZanjato = .T.
ELSE
_Return=.F.
ENDIF
FINALLY
ENDTRY
ENDDO

* Резко закрываем активные базы и таблицы
CLOSE DATABASE ALL
RETURN _Return


вариант А:
запускаю форму-архивирую, все нормально
Все как бы нормально, обрабатывается
возвращает _Return=.T.

Вариант Б:
Эмулируем тыкания кнопок юзера на одной
локальной машине, без участия сети:
-юзер нажал форму с данными,
соответственно открыл БД шарово,
все нормально, данные в гридах видит и радуется.
-стукнуло ему в голову не закрыв форму
с данными запустить форму архивации, и моему удивлению нет предела!!!
хоть и БД открыта им шарово на локальной машине,
легко выполняется строка
OPEN DATABASE (tcnamebasedan) EXCLUSIVE
и соответственно
эта процедурка возвращает RETURN _Return
Начинаем архивировать и получаем ошибки на
невозможность архивации дбф-ок, которые участвуют
в форме данных.

пробовал и fopen(...,2) use контейнер.DBC excl
итд-такая же билиберда.

То вдруг возникает такая ситуация-
запустили форму с отображением данных-
запустили на архивацию-опять никакого предупреждения что
что то там используется,выполняется
CLOSE DATABASE ALL
RETURN _Return
все архивируется,
но форма с данными остается
с "белыми гридами" :-)

Вопрос:
как же мне эта безболезненно обойти это все???
предложения по архивированию раром с ключом
"архивировать испольуемые файлы",
руками в форме открывать, потом закрывать таблицы и
контейнеры баз не прредлагать
Неужели к 9 фоксу ничего мудрого не придумано???
...
Рейтинг: 0 / 0
Open DATABASE EXCL
    #33363012
_Иван_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, приходиться беседовать тихо сам с собою..........
Неужели нет соображений??
Ваще меня удивляет возможность выполнения команд,
следующих друг за другом
open database data shared
open database data excl
без всяких ошибок. Почему?

Проблему с открытием решил так
автор
LOCAL namebasewithrash,_Return,lcOldError
namebasewithrash= tcnamebasedan+'.DBC'
_Return=.f.
lcOldError=ON("ERROR")

ON ERROR
CLOSE DATABASES ALL
lnFH=Fopen(namebasewithrash,2)
IF m.lnFH<0
Messagebox("Для выполнения данной операции требуется эксклюзивный доступ к данным."+Chr(13)+ ;
"Закройте все окна, завершите работу программы на других компьютерах и повторите попытку.",16,"Ошибка!!!")
ON ERROR &lcOldError
_Return=.f.
ELSE
_Return=.T. &&открылась БД
ENDIF

Fclose(m.lnFH)

ON ERROR &lcOldError
CLOSE DATABASES ALL
RETURN _Return=.T.


Но проблема "белых гридов"
остается
То есть если открыта форма с данными,
и происходит процедуры архивации,
то БД закрывается.
Че делать, как быть
...
Рейтинг: 0 / 0
Open DATABASE EXCL
    #33363095
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте закрыть проект разработки программы - он открывает Database exclusive...
...
Рейтинг: 0 / 0
Open DATABASE EXCL
    #33363141
_Иван_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey ChПопробуйте закрыть проект разработки программы - он открывает Database exclusive...
Я веду речь о экзешнике, извините что не сказал сразу
сузим вопрос :-)
почему легко в командном окне выполняется
3 строчки без ошибок
CLOSE DATABASE ALL
open database data shared
open database data excl

и как это побороть
...
Рейтинг: 0 / 0
Open DATABASE EXCL
    #33363533
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_иван_3 строчки без ошибок
CLOSE DATABASE ALL
open database data shared
open database data excl

Я бы сказал, что это глюк. А побороть достаточно просто:

Код: plaintext
1.
2.
3.
open database data shared
CLOSE DATABASE
open database data exclusive

Т.е. перед открытием контейнера базы данных его надо явно закрыть. В этом случае, если данная база данных открыта другим пользователем, то получим сообщение об ошибке.

Кстати, есть функция проверяющие статус открытия таблиц и контейнера базы данных в текущем сеансе:

Код: plaintext
1.
2.
3.
?SET("DataBase")   && какая база данных сейчас текущая
?DBUSED("MyBase")  && Открыта ли вообще указанная база данных
?IsExclusive("MyBase", 2 )  && Статус Exclusive у указанной базы данных

Т.е. вообще-то, надо бы писать так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
* Если база данных УЖЕ открыта, но в режиме SHARED, то закрываю ее
IF DBUSED("MyBase") = .T. AND IsExclusive("MyBase", 2 ) = .F.
	CLOSE DATABASE ALL
ENDIF
* Если база данных НЕ открыта, то пытаюсь ее открыть в режиме EXCLUSIVE
IF DBUSED("MyBase")=.F.
	* Вот здесь ловим возможные ошибки открытия
	OPEN DATABASE MyBase EXCLUSIVE
ENDIF


_иван_
команд
SET DATABASE TO (namebasedan)
open database....
НЕТ!!!

А вот это очень зря.

Надо, как минимум, сделать явное открытие контейнера базы данных в стартовой программе. Если в данный момент идет архивация (т.е. база данных открыта в EXCLUSIVE), то сразу при старте получаешь ошибку и выбрасываешь пользователя из проги - пусть ждет окончания архивации.
...
Рейтинг: 0 / 0
Open DATABASE EXCL
    #33364063
_Иван_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо Владимир за подробный ответ...
Но толи место, на котором я сижу пишеться
с буквой "б", толи что...
Вот смотрите
Сделал такую процедуру для
проверки
автор
LPARAMETERS tcnamebasedan
IF !PARAMETERS()=1
MESSAGEBOX("Не передан параметр-название БД")
RETURN
ENDIF
**************************************************************
LOCAL namebasewithrash,_Return
namebasewithrash= tcnamebasedan+'.DBC'
_Return=.f.
* Если база данных УЖЕ открыта, но в режиме SHARED, то закрываю ее
IF DBUSED(tcnamebasedan) = .T. AND IsExclusive(tcnamebasedan,2) = .F.
CLOSE DATABASE ALL
ENDIF

* Если база данных НЕ открыта, то пытаюсь ее открыть в режиме EXCLUSIVE
IF DBUSED(tcnamebasedan)=.F.
* Вот здесь ловим возможные ошибки открытия
TRY
OPEN DATABASE (tcnamebasedan) EXCLUSIVE VALIDATE
_Return=.t.
CATCH
=MESSAGEBOX("Невозможно открыть файл базы данных: "+tcnamebasedan+CHR(13)+;
"для эксклюзивного использования."+CHR(13)+CHR(10)+;
"Файл заблокирован для администрирования."+CHR(13)+;
" "+CHR(13)+;
"Повторите попытку позже..." , 16, "Ошибка!!!", 20000)
_Return=.f.
FINALLY
CLOSE DATABASE ALL
ENDTRY
ENDIF

RETURN _Return



Смотрю в отладчике, все закрывается как положено
строки между
TRY
OPEN DATABASE (tcnamebasedan) EXCLUSIVE VALIDATE
_Return=.t.
CATCH
выполняются,
затем выполняется
CLOSE DATABASE ALL

Начинаю процедуру архивации,
и идет затык на строке
df=Fopen(xfile)
If Not df>0
=Messagebox("Íåâîçìîæíî îòêðûòü ôàéë:"+Chr(13)+xfile,64,"Âíèìàíèå...")
Return .f.
Endif

df-это как Вы понимаете какой-то файл БД
У меня уже голова кипит от этого непонимания!!!!
...
Рейтинг: 0 / 0
Open DATABASE EXCL
    #33364307
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты слишком торопишся. Дело в том, что команда CLOSE DATABASE может и не закрыть базу данных. В HELP по этому поводу сказано что база данных НЕ закроется, если активна форма, использующая эту базу данных, но в другой (Private) DataSession.

Т.е., по большому счету, надо бы проверить факт закрытия базы данных

Код: plaintext
1.
2.
3.
4.
CLOSE DATABASE ALL
IF DBUSED("MyBase")=.T.
* Закрыть базу данных не удалось
ENDIF

Но, лично я действую по другому. Я сначала закрываю все открытые формы, если это удалось, то пытаюсь переоткрыть контейнер базы данных в режиме EXCLUSIVE, если это удалось, то запускаю процедуру резервного копирования всх файлов DBF, CDX, FPT КРОМЕ контейнера базы данных. Затем переоткрываю контейнер базы данных в режиме SHARED и делаю резервную копию уже только контейнера базы данных (файлы DBC, DCT, DCX). Затем, если необходимо, архивирую эту резервную копию.

Здесь "фокус" в том, что пока контейнер базы данных открыт в режиме EXCLUSIVE никто не сможет работать ни с одной таблицей, включенной в контейнер базы данных. Т.е. нет риска получить копию базы данных посередине процесса модификации.

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

Ну, и нет смысла указывать опцию VALIDATE при открытии базы данных. Это тебе ничего не даст. Точнее, конечно, это выдаст сообщение об ошибке, если структура базы данных повреждена, но корректного лечения не будет.
...
Рейтинг: 0 / 0
Open DATABASE EXCL
    #33364528
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi _иван_!

1) Если БД УЖЕ открыта, то повторный OPEN DATABASE ... (хоть EXCLUSIVE хоть
без него) не даёт ошибки, но и ничего не делает. Это описано в хелпе к
команде OPEN DATABASE.
2) Реальный режим открытия БД можно проверит по ISEXCLUSIVE("имя_базы", 2)

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Open DATABASE EXCL
    #33364549
_Иван_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо Владимир, исчерпывающее
прошу извинений за затраченное время.

Вариант с Fopen(namebasewithrash,2)
помоему пока рулит нормально(надо сдавать проект), единственное
что мне не нравиться, это-ON ERROR
Да и TRY......
тоже не нравиться.
Ваще бы запретил в программах, а то расслабляет.
:-)
...
Рейтинг: 0 / 0
Open DATABASE EXCL
    #33364679
alex11100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да и TRY......
тоже не нравиться.
Ваще бы запретил в программах, а то расслабляет


лихо!!!!
ну даешь!!
сказать ничего не могу, слов не хватат.
...
Рейтинг: 0 / 0
Open DATABASE EXCL
    #33364757
_Иван_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex11100Да и TRY......
тоже не нравиться.
Ваще бы запретил в программах, а то расслабляет


лихо!!!!
ну даешь!!
сказать ничего не могу, слов не хватат.

А что мы какие нибудь Java програмеры чтоли???
Чтоб ошибки "глотать"
Мы ваще серьезные вещи пишем- СУБД называются
Ошибки обрабатывать нада.
:-)))))

да шютка, шютка
...
Рейтинг: 0 / 0
Open DATABASE EXCL
    #33364800
alex11100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а кто мешает

try
критичная команда
lsuccess=.t.
catch to oErr
myerr(oErr)
endtry
if !lsuccess
retu
endif


не понял
нравится on erro ????

а чем try не нравится???
...
Рейтинг: 0 / 0
Open DATABASE EXCL
    #33364804
alex11100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемый, _иван_
может вы чего недопоняли???

а кто Вам мешает в конструкции try..endtry обработать ошибку???
...
Рейтинг: 0 / 0
Open DATABASE EXCL
    #33364833
_Иван_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alex11100Уважаемый, _иван_
может вы чего недопоняли???

а кто Вам мешает в конструкции try..endtry обработать ошибку???

Многоуважаемый alex11100
хепл по try я прочитал,
;) в отдличии от хелпа по
OPEN DATABASE,
просто поведение с открытием
какое то не тривиальное-сначала шарово открывается,
а потом на эксклюзивное открытие и может не открыться, и молча.....,

:-)

Потому говорю в 3 раз, что шучу, шучу.
Все нормально, я все понял,
даже про объект oException
знаю и использую
...
Рейтинг: 0 / 0
Open DATABASE EXCL
    #33364863
alex11100
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
так шутить не стоит

да, и о том что не было сказано

если Вы раз открыли БД
дальше хоть переоткрывайтесь
(на самом деле и ничего не происходит)
даже метод dbc_OpenData не отрабатывает

есть еще способ
если Вы наверняка хотите, чтобы ее никто не дергал
можно в методах вложенной процедуры сделать
вывешивание флага на время архивирования
...
Рейтинг: 0 / 0
Open DATABASE EXCL
    #33364998
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi Владимир!

> Я бы сказал, что это глюк

Это не глюк, а исторически сложившееся и описанное в хелпе поведение.
Отличие от USE тут в том, что БД не открывается в какой-то определённой
рабочей области или даже DataSession, а открывается "глобально" - для всего
приложения. И потому делать "автоматически" CLOSE DATABASES при попытке
"переоткрытия" нельзя. Уже хотя-бы потому что могут быть открыты
таблицы/представления принадлежащие этой БД...

2 _иван_
Ну ты блин нетерпеливый - это значится вместо заслуженного отдыха в выходные
все срочно должны решать твою проблему :)

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Open DATABASE EXCL
    #33366667
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Igor Korolyov
Hi Владимир!

> Я бы сказал, что это глюк

Это не глюк, а исторически сложившееся и описанное в хелпе поведение.
К сожалению, в HELP описание этого поведения попало только в версии VFP9. В ранних версиях ничего подобного описано не было. Отсюда и такой вывод.

Igor Korolyov
Отличие от USE тут в том, что БД не открывается в какой-то определённой
рабочей области или даже DataSession, а открывается "глобально" - для всего
приложения. И потому делать "автоматически" CLOSE DATABASES при попытке
"переоткрытия" нельзя. Уже хотя-бы потому что могут быть открыты
таблицы/представления принадлежащие этой БД...
Да. Согласен. Но вопрос-то ставился о некоторой служебной операции (архивировании), которая изначально предполагает, что все формы должны быть закрыты. Поэтому переоткрытие базы данных в данном конкретном случае вполне уместно.
...
Рейтинг: 0 / 0
Open DATABASE EXCL
    #33367600
_Иван_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_иван_
Приветсвую еще раз, вопрос не так прост как казалось
бы мне сначала.
КАк я говорил сразу, используются приватные сессии,
и используется форма для архивации.
Юзер наоткрывал приватных форм
а потом решил начать архивировать

И никак я не могу отдифференцировать
открыта ли БД шарово по сети или
открыта в приватной сессии
чотбы дать команду на
"закройте все активные формы"
или
"БД используется в сети "

а команда close database
то закрывает ,то не закрывает БД
(активные приватные сессии)
И если активна форма-то "белые гриды"

Вообщем я лично не вижу разрешения проблемы
закрытия БД без закрытия форм(скажите что я не прав).

дак и с закрытием форм проблемы:


автор* Если база данных УЖЕ открыта, но в режиме SHARED, то закрываю ее
IF DBUSED(tcnamebasedan) = .T. AND IsExclusive(tcnamebasedan,2) = .F.
*поищем в коллекции форм главную и эту
FOR EACH loForm IN _vfp.Forms
llForms=.f.
IF loForm.Name#'MAINFORM' OR loForm#thisform &&AS TOP FORM и форма архивации
llForms=.f.
ELSE
llForms=.t.
ENDIF

ENDFOR

IF Messagebox("Для выполнения данной операции требуется эксклюзивный доступ к данным."+Chr(13)+ ;
"Закрыть все окна и повторить попытку?",4+48+0,THISFORM.Caption)=1 AND llForms=.T.
*Закроем формы, которые могут использовать приватные сессии и БД на локальной машине
*сначала закроем модальные формы
FOR EACH loForm IN _vfp.Forms
IF loForm.Name#'mainform' OR loForm#thisform
TRY
*Бывает, что в колеекции не находит свойство WindowType
IF loForm.WindowType=1
loForm.click()
loForm.release()
ENDIF
CATCH
FINALLY
ENDTRY
ENDIF
ENDFOR

FOR EACH loForm IN _vfp.Forms
IF loForm.Name#'mainform' OR loForm#thisform
loForm.click()
loForm.release()
ENDIF
ENDFOR
ELSE
_Return=.f.
RETURN _Return
ENDIF
ENDIF

* Если база данных открыта, то пытаюсь ее закрыть
IF DBUSED(tcnamebasedan) = .T. AND IsExclusive(tcnamebasedan,2) = .F.
CLOSE DATABASES ALL
ENDIF
...
Рейтинг: 0 / 0
Open DATABASE EXCL
    #33367648
_Иван_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин неоттуда скопироавл код,
для проверки пользую такой,
но он не работает :((

автор
LOCAL namebasewithrash,_Return,lcOldError
namebasewithrash= tcnamebasedan+'.DBC'
_Return=.f.

* Если база данных УЖЕ открыта, но в режиме SHARED, то закрываю ее
IF DBUSED(tcnamebasedan) = .T. AND IsExclusive(tcnamebasedan,2) = .F.


*поищем в коллекции форм главную и эту
LOCAL lnI
llFormsOn=.F.
FOR lnI=1 TO _VFP.Forms.Count
IF !UPPER(_VFP.Forms(lnI).Name)=="MAINFORM" OR !UPPER(_VFP.Forms(lnI).Name)==UPPER(thisForm.Name);
OR UPPER(_VFP.Forms(lnI).BaseClass)=="TOOLBAR"
llFormsOn=.T.
EXIT
ENDIF
ENDFOR




IF Messagebox("Для выполнения данной операции требуется эксклюзивный доступ к данным."+Chr(13)+ ;
"Закрыть все окна и повторить попытку?",4+48+0,THISFORM.Caption)=1 AND llFormsOn=.T.
*Закроем формы, которые могут использовать приватные сессии и БД на локальной машине
*сначала закроем модальные формы
FOR EACH loForm IN _vfp.Forms
TRY
*Бывает, что в колеекции не находит свойство WindowType
IF loForm.WindowType=1
loForm.click()
loForm.release()
ENDIF
CATCH
FINALLY
ENDTRY
ENDFOR

FOR EACH loForm IN _vfp.Forms
loForm.click()
loForm.release()
ENDFOR
ELSE
_Return=.f.
RETURN _Return
ENDIF
ENDIF

* Если база данных открыта, то пытаюсь ее закрыть
IF DBUSED(tcnamebasedan) = .T. AND IsExclusive(tcnamebasedan,2) = .F.
CLOSE DATABASES ALL
ENDIF
...
Рейтинг: 0 / 0
Open DATABASE EXCL
    #33367862
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi _иван_!

Естественно что смотреть надо ИМЕННО на наличие форм работающих с данной
базой. Можно конечно поизвращаться, через ASESSIONS(laTemp) + цикл по всем
сессиям и в каждой смотреть какие курсоры открыты. принадлежат они нашей
базе или нет и т.п. А можно проще - попросить юзера (или самому, через код)
закрыть все формы кроме этой служебной формы архивирования.
P.S. Я вообще считаю что лучше подобные служебные действия вынести в
отдельный exe, а не городить "страшные" пункты в основной проге.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Open DATABASE EXCL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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