Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Восстановление соединения ADO

302
27 октября 2006 года
Sagittarius
648 / / 12.04.2003
Вопроса всего 3 :) :
- Как определить, что ADO соединение (ADOConnection) было разорвано?
- Как восстановить разорванное соединение?
- Можно ли эту работу по отслеживанию и восстановлениею соединения взвалить на ADO?
387
27 октября 2006 года
Ihbif19
421 / / 28.10.2004
[QUOTE=Sagittarius]Вопроса всего 3 :) :
- Как определить, что ADO соединение (ADOConnection) было разорвано?
- Как восстановить разорванное соединение?
- Можно ли эту работу по отслеживанию и восстановлениею соединения взвалить на ADO?[/QUOTE]
if Table.Active then ShowMessage('установлено') else ShowMessage('разорвано');
Если значение true то соединение активное, false это false(ложь)
309
28 октября 2006 года
el scorpio
1.1K / / 19.09.2006
Через объект TAdoConnection. В нём формируется ConnectionString. Объекты AdoTable, AdoQuery и прочие компонентамы связываются с ним через свойство Connection

Свойство Connected - наличие соединения с БД
Свойство KeepConnection - режим сохранения соединения, когда нет соединений от компонентов доступа к данным.
Остальные свойства и методы перечислять не буду - смотрите F1

Работа по остлеживанию чего-либо выполняется через события. Нужно написать в форме требуемые обработчики событий для объекта TAdoConnection - вот и всё :D
302
30 октября 2006 года
Sagittarius
648 / / 12.04.2003
Спасибо за советы.

Я не совсем полно отразил картину.
На клиентских компб.терах есть приложения, которые устанавливают соединение с сервером БД. В сети действует сетевой экран, который, если какое-то соединение долго не проявляет активности, разрывает соединение. Естественно, никакие оповещения компоненту ADOConnection не посылаются. Вот.

Как узнать, что связь была разорвана? Как восстановить соединение?

В небольших приложениях, это можно решить просто переоткрытием соединения, а также переоткрытием всех открытых ADODataSet. В больших приложениях, такой подход помогает редко. Как быть?
309
30 октября 2006 года
el scorpio
1.1K / / 19.09.2006
Цитата:
В сети действует сетевой экран, который, если какое-то соединение долго не проявляет активности, разрывает соединение.


А в чём проблема - в свойствах/методах AdoConnection нет решения? Да вообще-то этот компонент должен сам восстанавлить связь с БД по запросу какого-либо из связанных с ним компонентов.

Ну а ежели ничего не получается, можно попробовать решить задачу "в лоб" - периодически гонять "пустые" запросы, повесив в программе таймер.

 
Код:
TForm1.Timer1Timer ()
begin
    if AdoConn.Connected
           QueryPing.Execute;
end;

Компонент QueryPing - это отдельный AdoQuery, который будет содержать запрос наподобие "SELECT 0 as Field".
302
30 октября 2006 года
Sagittarius
648 / / 12.04.2003
[QUOTE=el scorpio]А в чём проблема - в свойствах/методах AdoConnection нет решения? Да вообще-то этот компонент должен сам восстанавлить связь с БД по запросу какого-либо из связанных с ним компонентов.[/QUOTE]
Любой обращение к БД после принудительного разрыва соединения приводит к появлению ошибки "Connection failure".

[QUOTE=el scorpio]Ну а ежели ничего не получается, можно попробовать решить задачу "в лоб" - периодически гонять "пустые" запросы, повесив в программе [/QUOTE]
Да, это может решить проблему, но в сети слишком большая нагрузка возникнет (много приложений). Админы против. :)
309
30 октября 2006 года
el scorpio
1.1K / / 19.09.2006
Можно попробовать разрывать соединение вручную при долгом простое связи.
Создаём 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;
}

Прошу прощения, что Builder - на Delphi будет точно так же.
Код работает - не знаю, как с вашим сервером, но локально он работает:
1. Когда выполняется команда ADO, таймер запускается заново.
2. За время работы таймера не было команд - соединение закрывается со стороны клиента.
3. Когда потребуется опять обратиться к БД - AdoConnection создаёт новое соединение.
8.4K
30 октября 2006 года
Dian
91 / / 18.02.2006
Цитата:
Ты это почуствуешь!!!


По окошку с красной штучкой :)

Цитата:
Ну а ежели ничего не получается, можно попробовать решить задачу "в лоб" - периодически гонять "пустые" запросы, повесив в программе таймер


У нас так и делали. Но не просто по таймеру, а при обращении к базе. Если обращения часто, то, разумеется, проверять не перед каждым.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог