Страница 1 из 1

TIBQuery и обрыв соединения

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

Re: TIBQuery и обрыв соединения

Добавлено: 01 дек 2005, 12:10
Merlin
Ex_Soft писал(а): Каким макаром можно забороть данную проблему?
www.ibase.ru - 2 статьи с разными вариантами.

Добавлено: 22 дек 2005, 12:58
Igor
2 Merlin - спасибо за наводку

Но моя проблема в том, что я не знаю как применить описанные изменения, т.е. скомпилировать исправленные файлы :oops:

Работаю с C++Builder 5, версия IBX 4.52 с обновлением.
Помогите информацией о том как перекомпилировать такие изменения в компонентах.

Спасибо!

Добавлено: 22 дек 2005, 13:25
kdv
либо переходить на fibplus, либо пытать авторов тех статей.

Добавлено: 22 дек 2005, 13:36
Merlin
Я дельфинист, так что без понятия как в билдере используется IBX и можно ли его без дельфей перекомпилировать. Мож кто другой подскажет.

Добавлено: 22 дек 2005, 14:35
Igor
2 kdv
Для перевода на fibplus требуються большие трудозатраты и пока рассматриваються как крайние меры.
За авторов спасибо, не подумал :oops: , если не найду ответа спрошу.


2 Merlin
Есть делфи 5, а как там внести эти изменения?

Добавлено: 22 дек 2005, 16:20
kdv
я не знаю, про какие трудозатраты речь, и вообще мне все равно - я указал варианты направления движения, поэтому выбор - личное дело каждого.

В C++Builder есть компилятор Delphi, вообще-то. я не знаю, правда, получится ли им скомпилировать IBX, но явно части исходников может не хватать.

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

Добавлено: 22 дек 2005, 17:27
Igor
kdv писал(а):Насчет "как там внести изменения" - берутся исходники, вносятся изменения и перекомпилируется. Ничего подробнее здесь сообщить просто невозможно.
:D

Значит с пунктом "берутся исходники" -
файлы перечисленные в статье http://www.ibase.ru/devinfo/ibx_connect.txt, я нашел по адресу CBuilder5\Source\Vcl\ но файла проекта для получения исправленного DCLIB50.bpl нет, где можно взять недостающую часть исходников???

остальное понятно и ясно ( во всяком случае пока :D )

Добавлено: 22 дек 2005, 17:32
kdv
а нет никакого файла проекта. Borland его не кладет в дистрибутив. Поэтому он конструируется руками...