У нас есть приложение Delphi7 + UIB + Firebird 2.5 для пиццерий, стабильно работающее в проводных сетях.
Но по Wi-Fi, (работает с планшетными компьютерами Win8/Win10), если соединение разорвано, UIBDatabase не может переподключиться автоматически.
(В настоящее время мы реконструируем все приложение, чтобы удалить «остатки IBX», но после обновления UIB до последней версии, похоже, проблемы еще хуже!)
После типичной потери соединения появляется сообщение об ошибке. является:
Project ...exe raised exception class EUIBError with message 'connection rejected by remote interface
Connection not established
GDS Code: 335544421 - SQL Code: -923 - Error Code: 101'. Process stopped.
Даже если я попытаюсь закрыть текущее соединение с помощью .IsConnected:=False
или .CancelAbort
, он больше не сможет снова подключиться:
Project ...exe raised exception class EUIBError with message 'invalid statement handle
Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements
GDS Code: 335544485 - SQL Code: -901 - Error Code: 165'. Process stopped. Use Step or Run to continue.
Поэтому, что бы мы ни делали, мы не можем восстановить соединение!
В худшем случае TabletPC переходит в спящий режим, потому что соединение определенно разорвано, но компонент считает, что он все еще находится в сети. Требуется минимум 8 секунд, чтобы понять, что запрос не может быть выполнен.
Мы пытались запустить TTimer раньше, чтобы принудительно отменить операцию через 2000 мс, но это событие никогда не запускается.
Поэтому мне интересно:
- Есть ли способ правильно обрабатывать эти случаи?
- Ни у кого больше нет таких проблем? (Красный здесь все связанные темы, найдено только 1 аналогичный с 0 решением .)
- Можно ли загрузить текущий компонент UIB из здесь, он не стабильный? (С трудом компилировался под D7 из-за множества ошибок несовместимости SynEdit!)
- Почему событие
.OnConnectionLoss
запускается только после повторной попытки повторного подключения? - Можно ли снова подключиться к:
ТАКОЙ ЖЕ транзакции,
завершить запрос
и правильно зафиксировать и закрыть?
(Поскольку мы можем прочитать транзакцию ID от Firebird.) ... поэтому серверу не нужно держать его открытым более 2 часов.