2017-06-28 179 views
0

我可以用下面的代碼連接到一個老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://stackoverflow.com/questions/4051147/odbc-driver-use-in-qt – Liviu

回答

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.

看到這裏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

相關問題