TIBQuery и обрыв соединения
Добавлено: 01 дек 2005, 09:23
В общем виде - все тривиально. Есть IBDatabase+IBTransaction->IBQuery->DataSource->DBGrid. В TEdit'е набираем чего-то и в DBGrid'е отражаем. (Собственно говоря - это просто дрозофила). И тут, вдруг
, теряется соединение. Все люди как люди (
компоненты), а TIBQuery как суперстар
И чего я с ним уже не пробовал делать
Ну не хочет он закрываться. И после восстановления соединения все равно продолжает быть открытым (EIBClientError Exception "Dataset open")
Хотя Active у него уже false.
Каким макаром можно забороть данную проблему?





Код: Выделить всё
void __fastcall TMainForm::EditInputChange(TObject *Sender)
{
AnsiString
Signature=EditInput->Text.Trim();
if(Signature.IsEmpty())
return;
try
{
if(!IBTransaction->InTransaction)
IBTransaction->StartTransaction();
if(!IBQuery->Prepared)
{
IBQuery->SQL->Text="select * from prod_list where prod_text like :Signature";
IBQuery->Prepare();
}
if(IBQuery->Active)
IBQuery->Close();
IBQuery->ParamByName("Signature")->AsString=Signature+"%";
IBQuery->Open();
}
catch(EIBClientError &eException)
{
if(eException.SQLCode==33 /* Dataset open */)
;
}
catch(EIBInterBaseError &eException)
{
if(eException.IBErrorCode==isc_lost_db_connection)
{
int
CountAttempts=3,
Attempt;
bool
Connect=false;
for(Attempt=0; !Connect && Attempt<CountAttempts; ++Attempt)
Connect=ConnectToDatabase();
if(!Connect && Attempt==CountAttempts)
throw Exception(ExtractFileName(__FILE__)+"("+__LINE__+"): Кердык!!!");
try
{
if(IBQuery->Prepared)
IBQuery->UnPrepare();
}
catch(EIBClientError &eException)
{
if(eException.SQLCode==33 /* Dataset open */)
;
}
}
}
catch(EIBError &eException)
{
}
catch(EDatabaseError &eException)
{
}
catch(Exception &eException)
{
}
}
//---------------------------------------------------------------------------
bool __fastcall TMainForm::ConnectToDatabase(void)
{
bool
Connect=false;
try
{
IBDatabase->Open();
Connect=true;
}
catch(EIBClientError &eException)
{
}
catch(EIBInterBaseError &eException)
{
if(eException.IBErrorCode==isc_unavailable)
;
}
catch(EIBError &eException)
{
}
catch(EDatabaseError &eException)
{
}
catch(Exception &eException)
{
}
return(Connect);
}
//---------------------------------------------------------------------------