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

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
Ex_Soft
Сообщения: 1
Зарегистрирован: 01 дек 2005, 08:57

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

Сообщение Ex_Soft » 01 дек 2005, 09:23

В общем виде - все тривиально. Есть 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);
}
//---------------------------------------------------------------------------
Каким макаром можно забороть данную проблему?

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

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

Сообщение Merlin » 01 дек 2005, 12:10

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

Igor
Сообщения: 3
Зарегистрирован: 27 окт 2004, 09:55

Сообщение Igor » 22 дек 2005, 12:58

2 Merlin - спасибо за наводку

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

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

Спасибо!

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 22 дек 2005, 13:25

либо переходить на fibplus, либо пытать авторов тех статей.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 22 дек 2005, 13:36

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

Igor
Сообщения: 3
Зарегистрирован: 27 окт 2004, 09:55

Сообщение Igor » 22 дек 2005, 14:35

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


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

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 22 дек 2005, 16:20

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

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

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

Igor
Сообщения: 3
Зарегистрирован: 27 окт 2004, 09:55

Сообщение Igor » 22 дек 2005, 17:27

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

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

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

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 22 дек 2005, 17:32

а нет никакого файла проекта. Borland его не кладет в дистрибутив. Поэтому он конструируется руками...

Ответить