Форум » [x]Harbour » Надо ли базы открывать в цикле ? » Ответить

Надо ли базы открывать в цикле ?

Andrey: Вопрос ко всем кто работает с DBF. Как вы открываете свои базы в программе, одно открытие базы или несколько попыток открытия базы ? Я сам всегда открываю файлы в одну попытку. Какая у вас практика по работе с базами ?

Ответов - 2

gfilatov2002: Andrey пишет: сам всегда открываю файлы в одну попытку. Аналогично. Andrey пишет: Как вы открываете свои базы в программе Например, так [pre2]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 [/pre2]

SergKis: Всегда открываю только в цикле (до 2-х секунд попытки). Это относится как к локальным так и сетевым dbf. Такие ожидания оправданы т.к. базу можно открывать Shared, Exclusive режимах кратковременно и (запись, чтение) и сразу закрываю, к базе может обращаться несколько приложений и сразу отвергать открытие и вступать в диалог, как то не камильфо + если открывать списком и открыв почти все, споткнутся на одном ... то же так себе. Еще исп. цикл при dbAppend(), тут в одном месте поленился и поставил стандартный вариант и попал, что периодически стало валится добавление (редко, но метко). Пришлось править и версию менять, то же так себе ощущения. Вариант dbAppend() [pre2] 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 [/pre2] Вариант DbUseArea() [pre2] 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 [/pre2]



полная версия страницы