【问题标题】:Force C++Builder to close a database session even if aborted强制 C++Builder 关闭数据库会话,即使已中止
【发布时间】:2026-02-19 19:45:01
【问题描述】:

Form1 连接到数据库并将连接保持在已发布的属性 Form1->DBSession 中。

在项目源代码中,我想确保此会话已关闭,即使程序被中止并抛出异常(在库中)。

我的代码包含使用

的表单
USEFORM("fForm1.cpp", Form1); 

在 WinMain 中编写此代码时

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

编译器不编译,因为它不知道 TForm1。我无法包含头文件,因为我需要使用 USEFORM 并得到一个重新声明错误,包括。

【问题讨论】:

  • 如何调用 abort()?您能否选择不使用 abort 并使用 exit() 和 atexit 或 throw exit_exception(exit_code);反而?这个 SO 问题可能会有所帮助:*.com/questions/397075/…
  • 我的问题是我必须在项目源中调用表单属性或表单方法。我无法控制退出 run 方法的代码,但我发现自己必须确保在大多数情况下调用 Form1->DBSession->close() 方法。

标签: c++builder


【解决方案1】:

您不需要在 WinMain() 中添加 try..finally 块。 WinMain() 退出后,所有活动的 TForm 对象都被自动释放。只需让 MainForm 在其析构函数中关闭 DBSession。

【讨论】:

  • 我在开发环境中使用Ctrl-F2停止执行时也是这样吗?
  • Ctrl-F2 或调用 abort() 不会调用析构函数,也不会到达 __finally 块。