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");
我正在尝试通过使用 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");