2009-12-08 5 views
0

Form1 se connecte à une base de données et conserve la connexion dans une propriété publiée Form1-> DBSession.Forcer C++ Builder à fermer une session de base de données même si elle est annulée

Dans la source du projet, je voudrais m'assurer que cette session est fermée, même si le programme est interrompu en lançant une exception (dans une bibliothèque).

Mon code comprend le formulaire en utilisant

USEFORM("fForm1.cpp", Form1); 

En écrivant ce code dans WinMain

try { 
    Application->Initialize(); 
    Application->CreateForm(__classid(TForm1), &Form1); 
    Application->Run(); 
} 
__finally 
    { Form1->DBSession->Close(); } 

le compilateur ne compile pas car il ne sait pas TForm1. Je ne peux pas inclure le fichier d'en-tête car j'ai besoin d'utiliser USEFORM et obtenir une erreur de redéclaration y compris.

+0

Comment abort() est appelé? Pourriez-vous choisir de ne pas utiliser abort et d'utiliser exit() et atexit ou throw exit_exception (exit_code); au lieu? Cette question SO peut être d'une certaine aide: http://stackoverflow.com/questions/397075/what-is-the-difference-between-exit-and-abort –

+0

Mon problème est que je dois appeler une propriété de formulaire ou une méthode de formulaire dans la source du projet. Je ne peux pas contrôler le code qui quitte la méthode d'exécution, mais je me trouve dans la position que je dois m'assurer que dans la plupart des circonstances la méthode Form1-> DBSession-> close() est appelée. –

Répondre

1

Vous n'avez pas besoin d'ajouter un bloc try..finally à l'intérieur de WinMain(). Après la fermeture de WinMain(), tous les objets TForm actifs sont automatiquement libérés. Il suffit à votre MainForm de fermer la DBSession à l'intérieur de son destructeur.

+0

Est-ce que cela est fait aussi lorsque j'utilise Ctrl-F2 pour arrêter l'exécution dans l'environnement de développement? –

+0

Ctrl-F2 ou les appels à abort() n'appellent pas de destructeur ni n'atteignent jamais un bloc __finally. –

Questions connexes