2015-05-09 302 views
2

我試圖用Qt-Framework連接到一個sql數據庫。QSqlDatabase :: open()總是返回true

不幸的是,儘管沒有建立連接(?),db.open()總是返回true(你可以設置任何密碼,主機名等)。我從查詢中推導出對數據庫沒有任何影響。

我在Ubuntu 14.04上使用LAMPP。

我有下面的代碼:

#include "mainwindow.h" 
#include "ui_mainwindow.h" 
#include <QApplication> 
#include <QSql> 
#include <QSqlDatabase> 
#include <QMessageBox> 
#include <QSqlQuery> 


void MainWindow::on_ButtonSQL_clicked() 
{ 

    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "con1"); 
    db.setHostName("localhost"); 
    db.setDatabaseName("kinectshop2015"); 
    db.setUserName("root"); 
    db.setPassword(""); 

    QMessageBox msgBox; 

    if (db.open()) { 
     msgBox.setText("Yay! Your database host is "+db.hostName()+" .\n"+" The name of the database is "+db.databaseName()+"."); 
     msgBox.exec(); 
    } 

    QSqlQuery query; 
    query.exec("INSERT INTO users (id, username, balance, isAdmin)" "VALUES(3, 'somebody', 10000, 1)"); 
} 
+2

我猜QSQLITE驅動忽略用戶名和密碼,因爲它[不支持這些功能](https://github.com/radekp/qt/blob/master/src/sql/drivers/sqlite/qsql_sqlite.cpp #L523)。 –

+0

耶,我能用QMYSQL驅動程序解決我的問題!在Ubuntu上,我需要安裝驅動程序:sudo apt-get install libqt5sql5-mysql – Alex

+0

如果這確實解決了問題,您應該將其添加爲答案並將答案標記爲已接受,以使其可見,您的問題已解決。 http://stackoverflow.com/help/self-answer – Erik

回答

-1

這是什麼解決了我的問題。我使用驅動程序QMYSQL而不是QSQLITE。我只使用了後者,因爲第一個無法加載。在Ubuntu & QT5只需輸入sudo apt-get install libqt5sql5-mysql來解決問題。

1

的一個問題是,你指定的connectionName。

QSqlDatabase QSqlDatabase::addDatabase(const QString & type, const QString & connectionName = QLatin1String(defaultConnection))

如果未指定connectionName中,則新的連接成爲默認連接

考慮到你的數據庫連接不是默認連接,你需要告訴QSqlQuery其分貝使用,即

QSqlQuery query(db); 
    query.exec("INSERT INTO users (id, username, balance, isAdmin)" "VALUES(3, 'somebody', 10000, 1)"); 

另一個'問題'是用sqlite你總是創建一個新的dat基於你所做的調用,因此問題不是數據庫沒有打開,而是它的內容不正確(因爲如果你指定一個不存在的文件名,它將是空的)。如果我把你的代碼,它理所當然地抱怨了query.exec之後添加

qDebug() << query.lastError(); 

QSqlError(1, 「無法執行語句」, 「沒有這樣的表:用戶」)

如果在插入查詢之前包含了創建表的語句

QSqlQuery createTable("create table users (id INTEGER, username TEXT, balance REAL, isAdmin INTEGER)",db); 
createTable.exec(); 

我正確地在新創建的數據庫文件中獲取表,並且它包含您試圖插入的條目。

這是否幫助?

+0

謝謝你的解釋。我實際上試圖實現的是將一個exntry插入**現有的**數據庫,而不是創建一個新的數據庫。我只使用QSQLITe驅動程序,因爲如果我使用QMYSQL它說我無法加載那個。 – Alex

+0

@Alex在這種情況下,你得到了什麼確切的錯誤? – Erik

+0

&「warning:GDB:無法設置控制終端:Unpassender IOCTL(I/O控制)f \ 303 \ 274r das Ger \ 303 \ 244t \ n」 QSqlDatabase:QMYSQL驅動程序未加載 QSqlDatabase:可用驅動程序:QSQLITE false QSqlQuery :: exec:數據庫未打開 – Alex