2014-08-29 30 views
1

第一:我使用Qt v5.3.1MinGW 4.8.2Window 7 32bit平臺。當連接到數據庫,我得到一個錯誤`司機不loaded`

windows 7運行我的申請,我發現它在連接到數據庫工作的罰款只有在安裝的Qt環境,也當Virtual PC相同的應用程序移動到像windows xp另一個平臺上,不幸的是,我發現數據庫的連接失敗並且出現錯誤消息driver not loaded,但該應用程序工作正常,但未連接到數據庫。

我嘗試:

  • 我用QSqlDatabase::drivers()檢查sqlite支持系統 ,並且結果是,sqlite數據庫 與許多其他類型的支持。

  • 我已經使用isValid()來檢查是否有一個有效的驅動程序,但 函數返回false,這表明該數據庫類型是 不可用或無法加載。

以下是我使用的代碼:

database.h

class database 
{ 
public: 
    static QSqlDatabase db; 
    static QString dbPath; 
    database(); 

    static void connect(); 
    static bool openConnection(); 
    static void CloseConnection(); 
    static void removeDB(); 
}; 

database.cpp

QSqlDatabase database::db = QSqlDatabase::addDatabase("QSQLITE"); 
QString database::dbPath = ""; 

database::database(){ 
} 

void database::connect(){ 
    database::dbPath = "database.db"; 
    database::db.setDatabaseName(database::dbPath); 
} 

void database::CloseConnection(){ 
    database::db.close(); 
} 

void database::removeDB(){ 
    database::db.removeDatabase(database::db.defaultConnection); 
} 

而且我已經如果數據庫文件存在或不檢查,而且我已經打開到數據庫的連接。

database::connect(); 
    if(QFile::exists(database::dbPath)){ 
     if(database::db.open()){ 
      ui->label->setText(ui->label->text() + "Connected."); 
      QSqlQuery qry; 
      qry.prepare("SELECT * FROM users"); 
      qry.exec(); 
      while(qry.next()){ 
       ui->listWidget->addItem(qry.value("username").toString()); 
       ui->listWidget->item(ui->listWidget->count()-1)->setData(Qt::UserRole, qry.value("id").toString()); 
      } 
      database::CloseConnection(); 
     }else{ 
      ui->label->setText(ui->label->text() + "Failed to connect to database"); 
     } 
    }else{ 
     ui->label->setText(ui->label->text() + "Database file does not found"); 
    } 

我不知道什麼是與數據庫的連接問題,一切正常,並沒有在我的應用程序沒有丟失文件和可執行文件旁邊的數據庫文件。

如何解決這個問題?

+1

您絕對不會發布代碼來檢查錯誤或返回代碼。你不應該先這麼做嗎?事實上,你所有的函數都返回'void',所以我沒有看到你如何檢查錯誤條件。 – PaulMcKenzie 2014-08-30 00:23:05

+0

數據庫文件的路徑應該是什麼? ('dbPath'不包含路徑。) – 2014-08-30 07:55:48

+0

@PaulMcKenzie:謝謝,我已經更新了我的問題,澄清了這一點。 – 2014-08-30 08:26:57

回答

0
QSqlDatabase database::db = QSqlDatabase::addDatabase("QSQLITE"); 

這條線是問題所在。這是全局代碼(在main之前運行的代碼),該代碼在創建實例之前會嘗試加載Qt插件。這個調用將因此失敗。

解決方案:離開它默認初始化,並呼籲addDatabase後創建QCoreApplication

更好的解決方案停止使用全局變量;您可以在main中打開數據庫連接,並將連接句柄傳遞給需要它的類(還請注意,QtSql類本地支持「連接名稱」的概念,因此您可以從任何地方訪問該連接,只要名稱正確連接)。

0

在Windows XP中,\Program Files不能被普通用戶使用。 (也不是在Windows 7,但根據上述結構,一些路徑可能被重定向。)

使用QDesktopServices::DataLocation(QT 4)或QStandardPaths::DataLocation(Qt的5)。

+0

謝謝,但你能給我一個例子,通過使用'QStandardPaths :: DataLocation'來改變當前路徑'database :: dbPath =「database.db」;'到正確的路徑。 – 2014-08-30 09:28:35

+0

'QDir :: cleanPath(QStandardPaths :: writableLocation(QStandardPaths :: DataLocation)+「/database.db」)' – 2014-08-30 09:38:07

+0

不幸的是,錯誤消息:'數據庫文件找不到'。現在不想連接到'windows 7'或'windows xp'上的數據庫,因爲數據庫文件'C:/ Users/username/AppData/Local/QtApplication/database.db'的路徑錯誤,但是正確的路徑是'C:\ QtApp'。 – 2014-08-30 10:20:55

0

database::dbPath = "database.db" means the database file beside the executable file or in the main directory of application"

此聲明是錯誤的。您給出的路徑是相對於當前工作目錄而言,而不是到可執行文件的位置。如果工作目錄和可執行文件的路徑碰巧是一樣的,那麼你只是遇到了一個不能依賴的巧合。不要在意可執行文件的位置不可寫,所以在那裏存儲任何可變數據沒有意義!

您需要將該數據庫存儲在其他位置,並且您必須明確說明它存儲的位置。

+0

謝謝,但我需要一個例子來澄清這個想法。 – 2014-08-31 09:31:18

+0

現在的問題是不想打開數據庫。 'if(database :: db.open()){} else {ui-> label-> setText(ui-> label-> text()+「無法連接數據庫」);}'此消息總是顯示'無法連接到數據庫'。並且我已將路徑更改爲'c:/ database.db'。 – 2014-08-31 14:18:18

+0

@LionKing那裏有一個數據庫嗎? – 2014-08-31 17:51:40