• 0
Камышев Александр

Обработка разрыва соединения в FireDAC

Вопрос

7 часов назад, Vitaldj сказал:

К счастью к сожалению не пользуюсь встроенными в стулию коннекторами к БД, только от devart. Поэтому подсказать не могу(

Раньше тоже пользовался продуктами devart, хоть и недорогие, удобные, надежные, но все же они платные, плюс вообще не люблю подключать сторонние компоненты. 

На oldschool теплом ламповом CBuilder приходилось много всего подключать: скины, компоненты доступа к бд, инди последних версий, компоненты для отчетов, png и т.п. С тех пор стараюсь избегать всего не родного.

FireDAC понравился, хорош CmdExecMode amAsync - The calling thread and GUI are not blocked. The called method will return immediately.

Позволяет работать с базой из основного потока без завешивания, отправил запрос и занимайся другими задачами пока callback не придет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

5 ответов на этот вопрос

  • 0
1 час назад, Камышев Александр сказал:

Раньше тоже пользовался продуктами devart, хоть и недорогие, удобные, надежные, но все же они платные, плюс вообще не люблю подключать сторонние компоненты. 

На oldschool теплом ламповом CBuilder приходилось много всего подключать: скины, компоненты доступа к бд, инди последних версий, компоненты для отчетов, png и т.п. С тех пор стараюсь избегать всего не родного.

FireDAC понравился, хорош CmdExecMode amAsync - The calling thread and GUI are not blocked. The called method will return immediately.

Позволяет работать с базой из основного потока без завешивания, отправил запрос и занимайся другими задачами пока callback не придет.

А как обстоит дело с обработкой разрыва соединения? А то у меня проект под win написанный еще на XE7 FireDAC, при малейшем обрыве связи с сервером идет в разнос - каждые несколько секунд появляется новое окошко с сообщением о ошибке, лечится только убитием процесса. Так и не смог обрабатывать корректно эту ошибку, на исключения нет реакции, родные события тоже не помогли.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

разрыв соединения - все корректно обрабатывается

void __fastcall TMyDBClient::ConnectionError( TObject *ASender, TObject *AInitiator, Exception *&AException )
{
status = dbcError;
#ifdef AUX_MODE
	error_string = AException->Message;
#endif
if ( FOnError ) FOnError( (TObject*)this );
Abort();
}
//---------------------------------------------------------------------------

void __fastcall TMyDBClient::QueryError(TObject *ASender, TObject *AInitiator, Exception *&AException)
{
status = dbcError;
#ifdef AUX_MODE
	error_string = AException->Message;
	error_string += "\r\nsql: " + fquery->SQL->Text;
#endif
if ( FOnError ) FOnError( (TObject*)this );
Abort();
}
//---------------------------------------------------------------------------

void __fastcall TMyDBClient::AfterDisconnect(TObject *Sender)
{
status = dbcNotConn;
#ifdef AUX_MODE
	log_string = "db - disconnect";
	if ( FOnLog ) FOnLog( (TObject*)this );
#endif
}

Abort() - чтобы не было исключения в Application

так тишина и только логи шелестят переподключениями

Andrey Efimov и Kitty понравилось это

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
15 минут назад, Камышев Александр сказал:

разрыв соединения - все корректно обрабатывается


void __fastcall TMyDBClient::ConnectionError( TObject *ASender, TObject *AInitiator, Exception *&AException )
{
status = dbcError;
#ifdef AUX_MODE
	error_string = AException->Message;
#endif
if ( FOnError ) FOnError( (TObject*)this );
Abort();
}
//---------------------------------------------------------------------------

void __fastcall TMyDBClient::QueryError(TObject *ASender, TObject *AInitiator, Exception *&AException)
{
status = dbcError;
#ifdef AUX_MODE
	error_string = AException->Message;
	error_string += "\r\nsql: " + fquery->SQL->Text;
#endif
if ( FOnError ) FOnError( (TObject*)this );
Abort();
}
//---------------------------------------------------------------------------

void __fastcall TMyDBClient::AfterDisconnect(TObject *Sender)
{
status = dbcNotConn;
#ifdef AUX_MODE
	log_string = "db - disconnect";
	if ( FOnLog ) FOnLog( (TObject*)this );
#endif
}

Abort() - чтобы не было исключения в Application

так тишина и только логи шелестят переподключениями

Чудесно! Попробую переписать под Берлин. В XE7 эти события при разрыве даже не вызывались :-(

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
5 минут назад, Евгений Корепов сказал:

Чудесно! Попробую переписать под Берлин. В XE7 эти события при разрыве даже не вызывались :-(

у меня seattle пока, хватает

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!


Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.


Войти сейчас

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу