C++ 检测是否安装了Microsoft Access驱动程序

C++ 检测是否安装了Microsoft Access驱动程序,c++,qt,ms-access,odbc,C++,Qt,Ms Access,Odbc,我可以使用以下代码连接到旧的Access数据库: bool LoadDb(const QString& file_path, QSqlDatabase& db_out, QSqlError& err) { QSqlDatabase db = QSqlDatabase::addDatabase("QODBC"); static const auto DRIVER_NAME = R"({Microsoft Access Driver (*.mdb, *.ac

我可以使用以下代码连接到旧的
Access
数据库:

bool LoadDb(const QString& file_path, QSqlDatabase& db_out, QSqlError& err)
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");

    static const auto DRIVER_NAME = R"({Microsoft Access Driver (*.mdb, *.accdb)})";
    const auto connection_string = QString(R"(Driver=%1;DSN='';DBQ=%2)").arg(DRIVER_NAME, file_path);
    db.setDatabaseName(connection_string);
    if (!db.open())
    {
        err = db.lastError();
        return false;
    }

    db_out = std::move(db);

    return true;
}
但是我想在前面测试驱动程序(“Microsoft Access数据库引擎”)是否已安装,以便向用户显示有意义的消息

以下连接字符串不起作用:

const auto connection_string = QString(R"(Driver=%1)").arg(DRIVER_NAME);
这个错误毫无意义。。。它是用法语写的:

[Microsoft][Pilote ODBC Microsoft Access]Erreur générale Impossible d'ouvrir la clé de Registre « Temporary (volatile) Ace DSN for process 0xa74 Thread 0xce4 DBC 0xb5518368                                                              Jet ». QODBC3: Unable to connect

有什么想法吗?最好是可移植代码。

如果可以访问
SQLSTATE
,请检查SQLSTATE是否为
IM002
。我认为如果找不到/加载驱动程序,总是会返回
IM002
,而例如,如果由于路径错误而找不到数据库文件,则会得到
HY000
SQLSTATE

对于无效的驱动程序字符串,我得到:

SQLSTATE-IM002;本机错误:0;[Microsoft][ODBC驱动程序管理器]未找到数据源名称,也未指定默认驱动程序

对于无效路径,我得到:

SQLSTATE-HY000;本机错误:-1044;[Microsoft][ODBC Microsoft Access驱动程序]不是有效的文件名。


有关返回值的更多详细信息,请参见此处:

Related:目前没有时间测试QT,我不希望降级到Windows级别。希望在做了一些研究之后我会回来。@Liviu:SQLSTATE是odbc规范的一部分,如果您不能从
QSqlError
对象访问它的值,我会感到惊讶。。但是我不知道qt。这应该需要5分钟,但我刚刚辞职:D。我将安装QT并尝试几个小时,但不是现在。我不会忘记你的回答,谢谢!