QSqlDatabase :: open()始终返回true

时间:2015-05-09 10:59:30

标签: c++ sql qt

我正在尝试使用Qt-Framework连接到SQL数据库。

不幸的是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 个答案:

答案 0 :(得分: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,你总是通过你正在进行的调用创建一个新的数据库,因此问题不是数据库没有打开,而是它的内容不正确(因为如果数据库的内容不正确,它将是空的你指定一个不存在的文件名)。如果我拿你的代码并添加

   qDebug() << query.lastError();

query.exec正确地抱怨

之后
  

QSqlError(1,“无法执行语句”,“没有这样的表:用户”)

如果我在插入查询之前包含一个用于创建表的语句

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

我正确地在新创建的db文件中获取该表,并且它具有您尝试插入的条目。

这有帮助吗?

答案 1 :(得分:-1)

这就解决了我的问题。我使用驱动程序QMYSQL而不是QSQLITE。我只使用了后者,因为第一个无法加载。在 Ubuntu&amp; QT5 只需输入 sudo apt-get install libqt5sql5-mysql 即可解决问题。