检测是否已安装Microsoft Access驱动程序

时间:2017-06-28 09:14:01

标签: 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, *.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

有什么想法吗?最好是便携式代码。

1 个答案:

答案 0 :(得分:1)

如果您可以访问SQLSTATE,则检查SQLState为IM002。我认为如果无法找到/加载驱动程序,则总会返回IM002,而如果因为路径错误而无法找到数据库文件,则会得到HY000 SQLSTATE

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

SQLSTATE IM002; Native Error: 0; [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified

对于无效路径,我得到:

SQLSTATE HY000; Native Error: -1044; [Microsoft][ODBC Microsoft Access Driver] Not a valid file name.

有关返回值的详细信息,请参阅此处:https://docs.microsoft.com/en-us/sql/odbc/reference/syntax/sqlconnect-function