Qt Sql 无法将变量绑定到 QSql 查询准备语句

Qt Sql not able to bind variables to QSqlQuery prepare Statement

我正在尝试通过使用 QSqlQuery 作为准备语句从 MySQL 数据库中获取一些记录:

 QString username=ui->textEdit_password->toPlainText();
 QString password=ui->textEdit_password->toPlainText();
 QSqlQuery query;
 query.prepare("SELECT * FROM login_access WHERE username=? AND password=?");
 query.addBindValue(username);
 query.addBindValue(password);
 query.exec();`

当我 运行 : std::string q_str1=query.executedQuery().toUtf8().constData(); std::cout<<"Query : "<<q_str1<<"\n"; 它输出: Query : SELECT * FROM login_access WHERE username=? AND password=? 其中“?”没有被替换并且查询 returns 自“?”之后什么都没有字符与数据库记录进行比较。

On 运行查询:SELECT * FROM login_access,查询returns login_access table.

中的所有数据库记录

我也试过替换“?”使用占位符“:uname”,“:pass”并将query.addBindValue(username);更改为query.bindValue(":uname",username);,并对密码字段进行相同操作。

我是运行宁QtCreator 4.4.1 谢谢。

使用 query.bindValue( ...) 因为这会设置占位符值。

我在一个带有占位符的 SQL 语句上测试了 executedQuery(),它返回了一个仅包含占位符而不是值的字符串。文档确实说在大多数情况下它是与 lastQuery() 相同的字符串。 http://doc.qt.io/qt-5/qsqlquery.html#executedQuery

您已确认不带 where 子句的 SQL 语句有效,因此下一阶段是检查您是否绑定了您认为绑定的内容。为此,请使用 boundValue(const QString placeholder) 来查明是否绑定了占位符值。

检查查询是否 运行 可能也很有用。

因此,在您的 query.exec 之后,您应该添加以下内容(假设这些是您的占位符)以检查这些内容:

qDebug() << query.lasterError();
qDebug() << query.boundValue(":uname");
qDebug() << query.boundValue(":pass");