TForm1.Timer1Timer ()
begin
if AdoConn.Connected
QueryPing.Execute;
end;
Восстановление соединения ADO
- Как определить, что ADO соединение (ADOConnection) было разорвано?
- Как восстановить разорванное соединение?
- Можно ли эту работу по отслеживанию и восстановлениею соединения взвалить на ADO?
- Как определить, что ADO соединение (ADOConnection) было разорвано?
- Как восстановить разорванное соединение?
- Можно ли эту работу по отслеживанию и восстановлениею соединения взвалить на ADO?[/QUOTE]
if Table.Active then ShowMessage('установлено') else ShowMessage('разорвано');
Если значение true то соединение активное, false это false(ложь)
Свойство Connected - наличие соединения с БД
Свойство KeepConnection - режим сохранения соединения, когда нет соединений от компонентов доступа к данным.
Остальные свойства и методы перечислять не буду - смотрите F1
Работа по остлеживанию чего-либо выполняется через события. Нужно написать в форме требуемые обработчики событий для объекта TAdoConnection - вот и всё :D
Я не совсем полно отразил картину.
На клиентских компб.терах есть приложения, которые устанавливают соединение с сервером БД. В сети действует сетевой экран, который, если какое-то соединение долго не проявляет активности, разрывает соединение. Естественно, никакие оповещения компоненту ADOConnection не посылаются. Вот.
Как узнать, что связь была разорвана? Как восстановить соединение?
В небольших приложениях, это можно решить просто переоткрытием соединения, а также переоткрытием всех открытых ADODataSet. В больших приложениях, такой подход помогает редко. Как быть?
Цитата:
В сети действует сетевой экран, который, если какое-то соединение долго не проявляет активности, разрывает соединение.
А в чём проблема - в свойствах/методах AdoConnection нет решения? Да вообще-то этот компонент должен сам восстанавлить связь с БД по запросу какого-либо из связанных с ним компонентов.
Ну а ежели ничего не получается, можно попробовать решить задачу "в лоб" - периодически гонять "пустые" запросы, повесив в программе таймер.
Код:
Компонент QueryPing - это отдельный AdoQuery, который будет содержать запрос наподобие "SELECT 0 as Field".
Любой обращение к БД после принудительного разрыва соединения приводит к появлению ошибки "Connection failure".
[QUOTE=el scorpio]Ну а ежели ничего не получается, можно попробовать решить задачу "в лоб" - периодически гонять "пустые" запросы, повесив в программе [/QUOTE]
Да, это может решить проблему, но в сети слишком большая нагрузка возникнет (много приложений). Админы против. :)
Создаём Timer с интервалом Разрыв_связи_с_сервером - 15 секунд (или любое другое время).
Далее используется свойство OnExecuteComplete для AdoConnection
Код:
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
Timer1->Enabled = false;
ADOConnection1->Close();
}
void __fastcall TForm1::ADOConnection1ExecuteComplete(
TADOConnection *Connection, int RecordsAffected, const Error *Error,
TEventStatus &EventStatus, const _Command *Command,
const _Recordset *Recordset)
{
Timer1->Enabled = false;
Timer1->Enabled = true;
}
{
Timer1->Enabled = false;
ADOConnection1->Close();
}
void __fastcall TForm1::ADOConnection1ExecuteComplete(
TADOConnection *Connection, int RecordsAffected, const Error *Error,
TEventStatus &EventStatus, const _Command *Command,
const _Recordset *Recordset)
{
Timer1->Enabled = false;
Timer1->Enabled = true;
}
Прошу прощения, что Builder - на Delphi будет точно так же.
Код работает - не знаю, как с вашим сервером, но локально он работает:
1. Когда выполняется команда ADO, таймер запускается заново.
2. За время работы таймера не было команд - соединение закрывается со стороны клиента.
3. Когда потребуется опять обратиться к БД - AdoConnection создаёт новое соединение.
Цитата:
Ты это почуствуешь!!!
По окошку с красной штучкой :)
Цитата:
Ну а ежели ничего не получается, можно попробовать решить задачу "в лоб" - периодически гонять "пустые" запросы, повесив в программе таймер
У нас так и делали. Но не просто по таймеру, а при обращении к базе. Если обращения часто, то, разумеется, проверять не перед каждым.