Автор | Сообщение |
|
| постоянный участник
|
Пост N: 7388
Зарегистрирован: 12.09.06
|
|
Отправлено: 01.06.23 16:11. Заголовок: Надо ли базы открывать в цикле ?
Вопрос ко всем кто работает с DBF. Как вы открываете свои базы в программе, одно открытие базы или несколько попыток открытия базы ? Я сам всегда открываю файлы в одну попытку. Какая у вас практика по работе с базами ?
|
|
|
Ответов - 2
[только новые]
|
|
|
| moderator
|
Пост N: 2136
Зарегистрирован: 11.02.10
|
|
Отправлено: 01.06.23 16:58. Заголовок: Andrey пишет: сам в..
Andrey пишет: цитата: | сам всегда открываю файлы в одну попытку. |
| Аналогично. Andrey пишет: цитата: | Как вы открываете свои базы в программе |
| Например, так FUNCTION OpenTable( cDBF ) LOCAL bOldHandler LOCAL lOpen := .T. LOCAL cAlias bOldHandler := ErrorBlock( {|o| Break(o)} ) cAlias := Upper( Left( cFileNoExt( cDBF ), 4 ) ) BEGIN SEQUENCE USE ( cDBF ) ALIAS ( GetNewAlias( cAlias ) ) NEW RECOVER lOpen := .F. MsgStop( "Unable to open file:" + CRLF + cDBF ) END ErrorBlock( bOldHandler ) RETURN lOpen STATIC FUNCTION GetNewAlias( cAlias ) LOCAL nArea := 1 LOCAL cNewAlias IF Select( cAlias ) != 0 REPEAT UNTIL Select( cNewAlias := ( cAlias + StrZero( nArea++, 3 ) ) ) != 0 ELSE cNewAlias := cAlias ENDIF RETURN cNewAlias
|
|
|
|
| постоянный участник
|
Пост N: 4281
Зарегистрирован: 17.02.12
|
|
Отправлено: 01.06.23 17:38. Заголовок: Всегда открываю толь..
Всегда открываю только в цикле (до 2-х секунд попытки). Это относится как к локальным так и сетевым dbf. Такие ожидания оправданы т.к. базу можно открывать Shared, Exclusive режимах кратковременно и (запись, чтение) и сразу закрываю, к базе может обращаться несколько приложений и сразу отвергать открытие и вступать в диалог, как то не камильфо + если открывать списком и открыв почти все, споткнутся на одном ... то же так себе. Еще исп. цикл при dbAppend(), тут в одном месте поленился и поставил стандартный вариант и попал, что периодически стало валится добавление (редко, но метко). Пришлось править и версию менять, то же так себе ощущения. Вариант dbAppend() Скрытый текст
FUNCTION mDbAppend( lRLock, nWhl ) LOCAL lRet := .F., nSleep := 10 DEFAULT lRLock := .T., nWhl := 10 NetErr( .F. ) WHILE nWhl-- > 0 lRet := .F. BEGIN SEQUENCE WITH { |e|break(e) } dbAppend(lRLock) lRet := ! NetErr() END SEQUENCE IF lRet; EXIT ENDIF wApi_Sleep( nSleep ) END RETURN lRet
| Вариант DbUseArea() Скрытый текст
FUNCTION mDbUse( cFile, cAls, lShared, cCdp, cRdd, nWhl ) LOCAL lRet, nSleep := 100 DEFAULT lShared := .T., nWhl := 10 NetErr( .F. ) SELECT 0 IF empty (cAls) ; cAls := '_XYZ_'+hb_ntos(select()) ELSEIF select(cAls) > 0; cAls += '_' +hb_ntos(select()) ENDIF WHILE nWhl-- > 0 lRet := .F. BEGIN SEQUENCE WITH { |e|break(e) } DbUseArea( .F., cRdd, cFile, cAls, lShared, , cCdp ) lRet := ! NetErr() .and. Used() END SEQUENCE IF lRet; EXIT ENDIF wApi_Sleep( nSleep ) END IF lRet IF OrdCount() > 0 ; OrdSetFocus(1) ENDIF dbGoTop() ENDIF RETURN lRet использование IF ( lRet := mDbUse(cFileDbf, cAlias) ) cAlias := ALIAS() ... (cAlias)->(dbCloseArea()) ELSE cMsg := "Error ! Database - ;" + cFileDbf + ";" cMsg += "busy with another process!" IF lMsg AlertStop( cMsg, App.ExeName ) ENDIF ? hb_DateTime(), cMsg ENDIF
|
|
|
|
|