C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Активная транзакция при закрытии программы
Kelf
Отправлено: 19.08.2005, 02:48


Не зарегистрирован







Использую компоненты FIBPlus:
DataBase->DataSet->DataSource и две транзакции
Есть форма для справочника с DBGrid подключеным к этому DS.
Таких цепочек и форм несколько (для каждого справочника, DataBase конечно только один).
На главной форме расположен DBGid сводной таблицы и DBLookupComboBox.
Lookup использует DS одного из справочников, у сводной таблицы свой DS.
Свойства DataSource & DataField LookupComboBoxa пустые, но есть такой обработчик:
CODE

void __fastcall TMainForm::LkOtdelChange(TObject *Sender){
  AnsiString sql="SELECT S.KOTD,S.KPRED,S.KURS,S.FOBUCH,S.ID FROM SPIS2 S WHERE s.kotd=";
   DM->dsTree->Close();
   DM->dsTree->SQLs->SelectSQL->Clear();
   sql+=LkOtdel->KeyValue;
   DM->dsTree->SQLs->SelectSQL->Add(sql);
   DM->dsTree->Prepare();
   DM->dsTree->Open();
}

dsTree DataSet сводной таблицы.
При закрытии программы вылетает ошибка "Невозможно отключиться от базы. У вас есть незакрытая транзакция"
greyich
Отправлено: 19.08.2005, 10:51


Дежурный стрелочник

Группа: Участник
Сообщений: 45



а какая база данных?
olegenty
Отправлено: 19.08.2005, 17:21


Ветеран

Группа: Модератор
Сообщений: 2412



в OnCloseQuery позакрывай всё, и всего-то делов. это можно сделать почти автоматом — все транзакции перечисляются в Transactions компонента TpFIBDatabase
** Admin
Отправлено: 21.08.2005, 22:19


Не зарегистрирован







Были проблемы при завершении программы
(закрытии главной формы программы).

Как оказалось связаны проблемы были с несколькими
TDBLookupComboboxEh находящихся на разных формах.
Простое (даже в правильном порядке) закрытие датасетов
не помогло.
Пришлось сначала отключить от событий TDBLookupComboboxEh
и только потом закрыть все запросы DBase->CloseDataSets();
и отключиться от базы DBase->Connected = false;.

Вот код:

CODE

 void __fastcall TFMain::FormClose(TObject *Sender, TCloseAction &Action)
{
     PageControl->OnChange = NULL; // также пришлось
                                                           // сначала отключить это событие

      for(int i=0; i<Application->ComponentCount; i++){
         if(dynamic_cast<TForm*>(Application->Components[i])){
             TForm* TmpForm = (TForm*)(Application->Components[i]);
             for(int j=0; j<TmpForm->ComponentCount; j++){
                 if(dynamic_cast<TDBLookupComboboxEh*>(TmpForm->Components[j])){
                     ((TDBLookupComboboxEh*)TmpForm->Components[j])->OnChange = NULL;
                     }//if
                 }//j
             }//if
         }// i


      if(DBase->Connected){
        DBase->CloseDataSets();
        DBase->Connected = false;
        }
}

Вернуться в Работа с базами данных в C++Builder