代码之家  ›  专栏  ›  技术社区  ›  Sailordi

QSqlQuery上次不工作

  •  0
  • Sailordi  · 技术社区  · 7 年前

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

    这是我试图执行的代码

    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

    2 回复  |  直到 7 年前
        1
  •  0
  •   eyllanesc Yonghwan Shin    7 年前

    行为是正确的,如果表为空,则不会有最后一个元素,因此 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
  •  -1
  •   JustWe    7 年前

    而不是:

    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() ?