2014-10-19 5 views
0

Я создаю приложение, которое извлекает данные с сервера sql. Спецификация - приложение, которое должно работать на одной или нескольких машинах, которые, однако, находятся в одной и той же локальной сети с той, на которой размещен сервер sql. 5 дней назад я столкнулся с ситуацией о том, что произойдет, если по какой-либо причине сетевой кабель одного из компьютеров, запускающих приложение, или компьютера, на котором размещен сервер sql, отключается. Я понял, что приложение замерзает, а затем Delpi-7 создает сообщения об ошибках. В конечном итоге приложение заканчивается недружелюбно.Обнаружение сетевого кабеля с отключенным интерфейсом с Delphi 7

Я попытался найти способ обработать это событие через «соединение: = ложь» элемента управления ADO1 или через события таблицы, которые приложения извлекали во время отключения, но, к сожалению, я потерпел неудачу.

Так что я спрашиваю, есть ли способ обнаружить, когда сетевой кабель локальной сети - или соединение с сервером sql - освобождается, чтобы показать сообщение пользователю для проверки его соединений и - в худшем сценарии - завершить приложение более дружелюбно (например, с помощью команды «application.terminate»).

Спасибо заранее

+0

Хорошая вещь с TCP является то, что ** соединение вернется ** если вы снова подключите кабель. – mjn

+0

См. (Относящийся к Datasnap): http://stackoverflow.com/a/556096/80901 – mjn

+0

Связанный (BDE): http://stackoverflow.com/questions/885686/how-can-i-keep-my-db -connection-from-failing-when-the-network-is-unstable –

ответ

0

Обычно клиенты базы данных Delphi генерировать исключения в случае ошибок, которые вы должны обрабатывать в коде приложения, показывая сообщения об ошибках, записи файлов журналов и т.д., перед завершением грациозно или повторно -требование (выполнение повторного подключения).

Если ваш код использует транзакции (что очень рекомендуется), потеря соединения должна быть безболезненной.

Вы также можете запускать запросы «проверки работоспособности» через регулярные интервалы времени для обнаружения потери соединения на ранней стадии. Это можно сделать, например, в пулах соединений с фоновым потоком, который обнаруживает устаревшие соединения. Эти запросы «ping» также поддерживают активные соединения, что может быть преимуществом в некоторых средах.

Другая стратегия, позволяющая сделать приложение менее уязвимым, заключается в том, чтобы как можно более короткие связи и транзакции. YMMV.

Смотрите также: Efficient SQL test query or validation query that will work across all (or most) databases

+0

@mjin, спасибо за ваш ответ. Так что, если я получу это правильно, поскольку я использую adoqueries для соответствующих таблиц моего db, и поскольку я открываю их только тогда, когда относительные формы (решетки внутри этих форм), необходимо проанализировать их данные, которые затем закрываются, я shloudn ' Не волнуйся. Ну, я не знаю, потому что ... в одной из моих форм у меня есть сетка, которая через «bottlesQ» adoquerry успешно анализирует таблицы bottlesT моего db. Теперь, если я потеряю сетевой кабель и прокрутку, у меня не будет проблем, так как у меня уже есть данные, а «bottlesQ» закрыт. Но если я попытаюсь либо вставить/отредактировать, либо удалить строку, то – kostas

+0

у меня проблема. Это потому, что параметр «держать» adoconnection1 задан как «истинный», и, несмотря на то, что соединения потеряны, свойство adoconnection1.connected по-прежнему «истинно» !!! И нет такого события или свойства - насколько я знаю - не в adoconnection1 или в моей таблице примеров «bottlesT», которые могут спросить о состоянии соединения до того, как произойдут какие-либо транзакции. трюк с таймером, кажется, дает обход этому препятствию. Однако я не знаю, какое именно событие или свойство adoconnection1 - или другого элемента управления - должен ли я проверить этот цикл – kostas

+0

, чтобы проверить состояние подключения db. Более того, я не знаю, будет ли этот цикл намного более тяжелым для всего приложения, что приведет к временным разрывам во время его выполнения.Если бы вы могли предоставить мне какой-нибудь пример кода, как справиться с этой проблемой, я был бы очень обязан. – kostas

Смежные вопросы