检测是不是安装了 Microsoft Access 驱动程序

Posted

技术标签:

【中文标题】检测是不是安装了 Microsoft Access 驱动程序【英文标题】:Detect that the Microsoft Access driver are installed检测是否安装了 Microsoft Access 驱动程序 【发布时间】:2017-06-28 09:14:01 【问题描述】:

我可以使用以下代码连接到旧的 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

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

【问题讨论】:

相关:***.com/questions/4051147/odbc-driver-use-in-qt 【参考方案1】:

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

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

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

【讨论】:

暂时没有时间测试 QT,我不想降到 Windows 级别。希望我会在研究后回来。 @Liviu:SQLSTATE 是 odbc 规范的一部分,如果您无法从 QSqlError 对象访问它的值,我会感到惊讶。但我不知道 qt。 doc.qt.io/qt-5/qsqlerror.html#nativeErrorCode 这应该需要 5 分钟,但我刚刚辞掉了那份工作 :D。我将安装 QT 尝试几个小时,但不是现在。我不会忘记你的回答,谢谢!

以上是关于检测是不是安装了 Microsoft Access 驱动程序的主要内容,如果未能解决你的问题,请参考以下文章

Microsoft Access 备份文件是不是具有专有格式?

根据 Microsoft Access 中的日期自动发送电子邮件

[Access][Microsoft][ODBC 驱动程序管理器] 无效的字符串或缓冲区长度 Invalid string or buffer length

inno setup怎么检测系统是不是安装了vcredist

C#下载了一个小access程式,打是时提示未在本地计算机上注册"Microsoft.Jet.OLEDB.4.0"

Access 数据库引擎和 Microsoft Access 之间的不兼容问题