我的项目是用 C++/MFC 编写的,并使用 CDatabase 和 CRecordset 来访问数据库。有时,MS SQL 服务器可能会关闭,中断我与数据库的连接,在这种情况下,我需要重新连接。我发现检测断开连接非常困难。我运行我的应用程序,并停止 MS SQL 服务器进行测试。
该函数CDatabase::IsOpen()
始终报告数据库已打开,即使在 MS SQL 已关闭、连接已断开并且 MFC 已抛出表示数据库已关闭的异常之后。只有在我在自己的代码中执行 CDatabase::Close() 之后,IsOpen() 才开始返回“false”。
所以我不得不检测需要我关闭并重新打开数据库连接的条件。Microsoft 抛出一个 CDBException 类型的对象。当我调用 时CDBException::GetErrorMessage()
,我会返回一个详细描述异常的字符串。但是,当我检查 CDBException::m_nRetCode 的值时,它始终包含 -1。
我宁愿依靠 CDBException::m_nRetCode 的明确定义的整数值来确定数据库连接是否丢失。相反,我在 CDBException::m_strError 中查找字符串“通信链路故障”
我强烈希望不必解析返回的错误字符串来确定异常类型。有人知道为什么我在 m_nRetCode 中得到 -1 吗?有人知道是否有办法明确检查断开连接吗?