Qt SQLITE 查询 QVariant 无效

Posted

技术标签:

【中文标题】Qt SQLITE 查询 QVariant 无效【英文标题】:Qt SQLITE Query QVariant Invalid 【发布时间】:2014-12-30 19:42:44 【问题描述】:

我正在从 2 个 lineedit 小部件中读取文本值,并使用这些小部件中的数据作为登录系统,但我无法,因为程序当前仅检查用户名是否在 SQLITE 数据库中,我'我不知道为什么。

我的连接是从

完成的
QSqlDatabase login = QSqlDatabase::addDatabase("QSQLITE");
login.setDatabaseName("/Users/Daniel/Dropbox/Stock_Control.sqlite");
if(!login.open())
    ui->label->setText("Unable To Connect To Database");

我的登录代码如下

static Home *home = new Home;
QSqlQuery query;
QString Username = ui->Username_lineEdit->text();
QString Password = ui->Password_lineEdit->text();
query.prepare("SELECT Login, Password FROM Program_account WHERE Login = '"+ Username +"' AND Password = '"+ Password +"'");
if(!query.exec())

    qDebug() << "SQL QUERY Login:" << query.executedQuery();
    qDebug() << "SQL ERROR Login:" << query.lastError();

else if(!query.first())

    qDebug() << "SQL QUERY Login:" << query.executedQuery();
    qDebug() <<  query.value(1);
    qDebug() << "SQL ERROR Login:" << query.lastError();
    tries++;
    int x = 10 - tries;
    ui->label->setText("Incorrect Username or Password " + QString::number(x) + " tries until timeout");

else

    qDebug() << "SQL QUERY Login:" << query.executedQuery();
    qDebug() <<  query.value(1);
    qDebug() <<  query.last();
    qDebug() << "SQL ERROR Login:" << query.lastError();
    tries = 0;
    home->show();
    close();

当 query.value(1) 运行时,输出是 QVariant(Invalid),我猜这是我的问题的根源,但我不知道为什么不解决它。

谢谢

【问题讨论】:

我在上述代码中的任何地方都没有看到query.value(1) 调用。你能详细说明一下吗? 我是我在测试时必须更改它,但 query.value(0) 给了我数据库 Program_account 中登录字段的值,但 query.value(1) 返回 QVariant (无效)我猜这就是为什么程序允许来自 Password QLineEdit 的任何密码,但只允许数据库中的用户名。 请注意,像您一样填写您的查询,您会受到 SQL 注入(使用登录“myLogin OR 1=1;”进行测试)。使用 query.bindValue() 或 .addBindValue() 会好很多。另外,我不知道 qDebug 如何打印 QVariant 对象,但我建议您只显式转换您的数据:query.value(0).toString()。 【参考方案1】:

通过查看上面的代码,我敢打赌 QSqlQuery 对象没有被正确初始化,因此没有成功执行语句。

您必须在创建 QSQlQuery 时将连接传递给它或手动设置它,如下所示:

QSqlQuery query(login);

由于这永远不会被设置,因此您对任何内容都执行查询并且它会失败。在这种情况下,QSQlQuery 对象上的错误消息并不理想。

【讨论】:

以上是关于Qt SQLITE 查询 QVariant 无效的主要内容,如果未能解决你的问题,请参考以下文章

请教QDatastream与QVariant的相关问题(QT编程)

Qt - 没有匹配函数调用‘QVariant::QVariant(MyClass&)’

Qt的QVariant类

使用 QVariant 的 Qt 调用方法

QVariant 反序列化给出无效值

Qt Customize QVariant