检测Microsoft Access驱动程序安装

问题描述:

我可以用下面的代码连接到一个老Access数据库:检测Microsoft 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 

任何想法?优选便携式代码。

+0

相关:https://*.com/questions/4051147/odbc-driver-use-in-qt – Liviu

如果您可以访问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.

看到这里FO r有关返回值的更多详细信息:https://docs.microsoft.com/en-us/sql/odbc/reference/syntax/sqlconnect-function

+0

现在没有时间来测试QT了,而我宁愿不降级到Windows级别。希望我会在一些研究后回来。 – Liviu

+0

@Liviu:SQLSTATE是odbc规范的一部分,如果你无法从'QSqlError'对象中访问它的值,我会感到惊讶......但我不知道qt。 – erg

+0

http://doc.qt.io/qt-5/qsqlerror.html#nativeErrorCode这应该需要5分钟,但我刚刚退出该工作:D。我会安装QT几个小时,但不是现在。我不会忘记你的答案,谢谢! – Liviu