使用QSqlQuery

时间:2019-11-15 21:28:47

标签: sqlite qt

我正在尝试使用Qt及其SQL处理部分编写一个简单的应用程序。我已成功连接到数据库,但是无论是SELECT还是INSERT,我都无法对它运行任何查询。 (该数据库是使用SQLite3开发的)

这是处理SQL部分的类的构造函数:

SQLHandler::SQLHandler(QObject *parent, QString dbname) : QObject(parent)
{
    dbName = dbname;

    database = QSqlDatabase::addDatabase(DATABASE_NAME);
    database.setDatabaseName(dbName);

    connectionState = database.open();
}

这是一个片段,我试图验证用户填写的两个字段:

bool SQLHandler::LoginValidation(const QString username, const QString password)
{
    QSqlQuery loginQuery("SELECT * FROM Cont WHERE Username = " +
                         username + " AND Parola = " + password + ";", database);

    if(!loginQuery.exec())
        qDebug() << loginQuery.lastError() << username << password << loginQuery.lastQuery();

    while( loginQuery.next() )
    {
        if( loginQuery.value(0).toString() == username && loginQuery.value(1).toString() == password )
        {
            return true;
        }
    }

    return false;
}

每当我运行此SELECT时,都会收到QSqlError(“”,“无法读取行”,“无查询”)错误。

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

您不应串联来构建查询,因为除了使它容易受到SQL Injection攻击之外,您还会错误地构建查询,而是使用占位符:

bool SQLHandler::LoginValidation(const QString & username, const QString & password)
{

    QSqlQuery loginQuery("SELECT * FROM Cont WHERE Username = ? AND Parola = ?", database);
    loginQuery.addBindValue(username);
    loginQuery.addBindValue(password);

    if(!loginQuery.exec()) 
        // ...