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

qsqlquery中isvalid()的解释

  •  1
  • Vaebhav  · 技术社区  · 8 年前

    您好,我无法理解qt中qsqlquery的isvalid方法的解释。

    对于isvalid(),查询始终返回false。

    对于next()、first()等为true

    我查了最后的错误,如果有的话,没有。

    我对qt不熟悉,有人能给我解释一下是什么意思吗?

    bool QSqlQuery::isValid () const
    
    Returns true if the query is currently positioned on a valid record; otherwise returns false.
    

    代码--

    query = QtSql.QSqlQuery()
    query.exec_("select * from test.PG_Details where PG_Id = 1")
    
    print("Bool->",query.isValid())     // Return FALSE
    print("Next->",query.next())        // Returns TRUE
    print("LE->",query.lastError().text())     //Returns Blank
    
    1 回复  |  直到 8 年前
        1
  •  3
  •   eyllanesc    8 年前

    文档不能正确解释概念,但是如果我们回顾 source code 以下内容:

    bool QSqlQuery::isValid() const
    {
        return d->sqlResult->isValid();
    }
    

    d->sqlResult 是一个 QSqlResult 如果我们检查 isValid() 方法 QSqlResult 以下内容:

    bool qsqlresult::isvalid()常量

    如果结果定位在有效记录上(即, 结果未定位在第一个或最后一个之前或之后 记录);否则返回false。

    我们清楚地知道回报是什么 QSqlQuery::isValid() ,将在两种情况下返回false,第一种情况是尚未为结果请求数据,第二种情况是没有数据。

    import sys
    from PyQt5 import QtSql
    
    def createConnection():
        db = QtSql.QSqlDatabase.addDatabase("QSQLITE")
        db.setDatabaseName(":memory:")
        if not db.open():
            return False
    
        query = QtSql.QSqlQuery()
        query.exec_("create table PG_Details (PG_Id int, firstname varchar(20), lastname varchar(20))")
    
        query.exec_("insert into PG_Details values(1, 'Danny', 'Young')")
        query.exec_("insert into PG_Details values(2, 'Christine', 'Holand')")
        query.exec_("insert into PG_Details values(1, 'Lars', 'Gordon')")
        query.exec_("insert into PG_Details values(2, 'Roberto', 'Robitaille')")
        query.exec_("insert into PG_Details values(1, 'Maria', 'Papadopoulos')")
    
        return True
    
    if __name__ == '__main__':
        if not createConnection():
            sys.exit(-1)
    
        query = QtSql.QSqlQuery()
    
        if not query.exec_("select * from PG_Details where PG_Id = 1"):
            print("Error: ", query.lastError().text())
    
        print("isValid: ", query.isValid(), "before")
    
        while query.next():
            res = query.value(0)
            print("isValid: ", query.isValid())
    
        print("isValid: ", query.isValid(), "after")
    

    结果:

    isValid:  False before
    isValid:  True
    isValid:  True
    isValid:  True
    isValid:  False after
    

    显然,在请求数据之前,在本例中,我们使用 query.value(0) ,为假,有数据时为真,无数据时为假。