IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.
Модератор: kdv
-
Ex_Soft
- Сообщения: 1
- Зарегистрирован: 01 дек 2005, 08:57
Сообщение
Ex_Soft » 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);
}
//---------------------------------------------------------------------------
Каким макаром можно забороть данную проблему?
-
Merlin
- Динозавр IB/FB
- Сообщения: 1502
- Зарегистрирован: 27 окт 2004, 11:44
Сообщение
Merlin » 01 дек 2005, 12:10
Ex_Soft писал(а):
Каким макаром можно забороть данную проблему?
www.ibase.ru - 2 статьи с разными вариантами.
-
Igor
- Сообщения: 3
- Зарегистрирован: 27 окт 2004, 09:55
Сообщение
Igor » 22 дек 2005, 12:58
2 Merlin - спасибо за наводку
Но моя проблема в том, что я не знаю как применить описанные изменения, т.е. скомпилировать исправленные файлы
Работаю с 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 требуються большие трудозатраты и пока рассматриваються как крайние меры.
За авторов спасибо, не подумал

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

)
-
kdv
- Forum Admin
- Сообщения: 6595
- Зарегистрирован: 25 окт 2004, 18:07
Сообщение
kdv » 22 дек 2005, 17:32
а нет никакого файла проекта. Borland его не кладет в дистрибутив. Поэтому он конструируется руками...