【问题标题】:QSqlQuery last not workingQSqlQuery 上次不工作
【发布时间】:2018-04-16 03:43:39
【问题描述】:

我试图在 SQLite 中获取已执行查询的大小,但是当我使用 last 并尝试使用 last 时,它总是错误的

这是我正在尝试执行的代码

void createDB() {
  QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE","CREATE_CON");

  db.setDatabaseName("C:/Desktop/TestDb.db3");
  db.open();

  QSqlQuery q(db);
  q.exec("CREATE TABLE IF NOT EXISTS Test(testCol TEXT PRIMARY KEY);");
}

int entries() {
  QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE","SELECT_CON");

  db.setDatabaseName("C:/Desktop/TestDb.db3");
  db.open();

  QSqlQuery q(db);
  q.exec("SELECT * FROM Test;");

  if(q.last() == false) {
    qDebug()<<q.lastError().text();
    qDebug()<<db.lastError().text();
  }
  return q.at()+1;
}

我得到的错误文本是空的,所以我不知道我做错了什么。
我可以很好地创建数据库,这样我的数据库实例就可以正常工作了。

操作系统:Windows 10
我正在使用:Qt 5.10.1
编译器:MinGW

【问题讨论】:

  • 如何创建表?
  • 你打开数据库了吗?你的代码很模糊,请提供minimal reproducible example
  • 我刚试了一下,它可以正常工作,如果不提供minimal reproducible example,您的问题将落入题外话“为什么这段代码不起作用?”
  • 你什么时候调用createDB()?
  • @eyllanesc 我在启动程序时调用 createDB() 函数,当我按下按钮时调用 entries() 函数。

标签: c++ qt sqlite


【解决方案1】:

行为是正确的,如果您的表为空,则不会有最后一个元素,因此 last() 将为 false。

我将通过这个问题向您展示您必须验证所有可能的错误。一个程序有时可以工作,但一个好的程序员的职责是阻止它一直工作。

#include <QApplication>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>

#include <QDebug>
#include <QPushButton>

static bool createDB() {
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE","CREATE_CON");

    db.setDatabaseName("TestDb.db3");
    if(!db.open()){
        qDebug()<<db.lastError().text();
        return false;
    }

    QSqlQuery q(db);
    if(!q.exec("CREATE TABLE IF NOT EXISTS Test(testCol TEXT PRIMARY KEY);")){
        qDebug()<<q.lastError().text();
        return false;
    }
    return true;
}

static int entries() {
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE","SELECT_CON");

    db.setDatabaseName("TestDb.db3");
    if(!db.open()){
        qDebug()<< db.lastError().text();
        return -1;
    }

    QSqlQuery q(db);
    if(!q.exec("SELECT * FROM Test;")){
        qDebug()<<q.lastError().text();
        return -2;
    }

    if(!q.last()) {
        return 0;
    }
    qDebug()<<"not empty";
    return q.at()+1;
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    if(!createDB()){
        return -1;
    }
    QPushButton button("call entries");
    QObject::connect(&button, &QPushButton::clicked, [&](){
        qDebug()<<entries();
    });
    button.show();
    return a.exec();
}

【讨论】:

    【解决方案2】:

    而不是:

    q.exec("SELECT * FROM Test;");
    
    if(q.last() == false) {
        qDebug()<<q.lastError().text();
        qDebug()<<db.lastError().text();
    }
    

    你应该这样做:

    if(!q.exec("SELECT * FROM Test;")) {
        qDebug()<<q.lastError().text();
    }
    

    如果您想知道查询的大小,为什么不将其存储在QString 中,并随时调用QString::length()

    【讨论】:

      猜你喜欢
      • 2018-03-11
      • 2019-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多