0

我的项目是用 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 吗?有人知道是否有办法明确检查断开连接吗?

4

1 回答 1

0

不幸的是 CDatabase::IsOpen() 只返回前面的 CDatabase::Open() 调用是否成功,而不是连接的当前状态。

查看 ::SQLError() 的文档和 CDBException::BuildErrorString() 的源代码表明 SQL 错误是一个复杂的野兽。但是我相信 CDBException::BuildErrorString() 中的断点可能会引导您找到解决方案。

附言。如果这种方法有用,您能否发布您的最终代码,因为我可能也需要它!

于 2013-11-08T03:23:54.373 回答