我的项目是用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
中查找字符串“Communication link failure”我强烈不希望不必解析返回的错误字符串来确定异常类型。有人知道为什么我在m_nRetCode中获得-1吗?有没有人知道是否有办法明确检查断开连接?
答案 0 :(得分:0)
不幸的是,CDatabase :: IsOpen()只返回前面的CDatabase :: Open()调用是否成功而不是当前的连接状态。
查看:: SQLError()的文档和CDBException的源代码:: BuildErrorString()表明SQL错误是一个复杂的野兽。但是我相信CDBException :: BuildErrorString()中的断点可能会引导您找到解决方案。
PS。如果这种方法很有用,你可以发布你的最终代码,因为我也可能需要它!