QSqlQuery

时间:2018-06-16 06:51:29

标签: python python-3.x pyqt pyqt5 qsqlquery

您好我无法理解Qt中QSqlQuery的isValid方法的解释。

对于isValid()

,查询始终返回False

并且对于next(),first()等

是真的

我检查了lastErrors,如果有的话,没有人

我是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 个答案:

答案 0 :(得分:3)

文档没有正确解释这个概念,但是如果我们审核source code

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

d->sqlResultQSqlResult,因此,如果我们检查isValid()QSqlResult方法的文档:

  

bool QSqlResult :: isValid()const

     

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

并且清楚地了解返回QSqlQuery::isValid()的内容,在2种情况下将返回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),它是False,当有数据时它是True,而当没有数据时它再次为False。