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