断开重连后仅出现SQL_HANDLE_HENV获取失败错误的求助
ODBC连接SQLServer异常问题
我找到过几个带有相同错误的类似问题,但那些问题都是因库或配置错误导致完全无法连接数据库,和我的情况不同。
我的情况是:可以正常连接远程SQL Server数据库,但当远程主机断开并重新上线后,会出现以下错误:
[unixODBC][Driver Manager]Driver's SQLAllocHandle on SQL_HANDLE_HENV failed
只有重启应用才能恢复连接。
以下是我的数据库连接代码:
bool OdbcSql::connectToDB(QUrl host, QString database, QString username, QString password) { _host = host; _database = database; _username = username; _password = password; if (_db.isOpen()) _db.close(); _db.removeDatabase("production"); _db = QSqlDatabase::addDatabase("QODBC", "production"); qInfo() << ID << "Trying to open database..."; _db.setDatabaseName(QStringLiteral("Driver=/opt/microsoft/msodbcsql18/lib64/libmsodbcsql-18.2.so.1.1; Server=%1;Database=%2; Encrypt=No;").arg(host.url()).arg(database)); _db.setUserName(username); _db.setPassword(password); _db.setConnectOptions("SQL_ATTR_CONNECTION_TIMEOUT=5;SQL_ATTR_LOGIN_TIMEOUT=5;SQL_ATTR_CONNECTION_POOLING=SQL_CP_OFF;"); bool ret = _db.open(); if (ret) qInfo() << ID << "Database opened successfully"; else qWarning() << ID << "Database opening failed:" << _db.lastError(); return ret; }
我的运行环境:Ubuntu 22.04、Qt 6.4.0,ODBC驱动为libmsodbcsql-18.2。
更新:问题复现完整步骤
- 启动应用程序
- 远程主机不可用(离线)
- 连接因登录超时失败
- 每分钟调用上述
connectToDB函数重试连接 - 远程主机上线,连接成功且可正常使用
- 一段时间后远程主机再次离线
- 检测到连接丢失(检测代码如下)
- 每分钟重试连接,但均因登录超时失败
- 远程主机重新上线,出现
SQL_HANDLE_HENV错误 - 仅重启应用程序才能重新连接
连接检测代码:
bool OdbcSql::checkConnectivity() { if (!_isConnected) return false; if (_db.transaction()) { _db.rollback(); return true; } else { _isConnected = false; _db.close(); qWarning() << ID << "Lost connection to database"; return false; } }
无法使用QSqlDatabase::isOpen()检测连接状态,因为它无法返回连接的实际状态,这段检测代码来自Stack Overflow和Qt论坛。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

