2015-05-09 307 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