Qt QSqlQuery准备的SELECT语句在exec()上失败
以下代码在Qt QSqlQuery准备的SELECT语句在exec()上失败,qt,select,exec,prepared-statement,Qt,Select,Exec,Prepared Statement,以下代码在QSqlQuery::exec()上失败。当我在没有prepared语句参数的情况下运行查询时,它会返回正确的结果,正如通过QSqlQuery::next() executedQuery()报告说,“:username”实际上没有被参数替换,而是被一个?替换(由于查询没有成功执行,应该是这样吗?) db是一个QSqlDatabase类变量,并且isOpen()报告true。Qt框架verison是4.7.3 DBSql::userInfo(const QString &user
QSqlQuery::exec()
上失败。当我在没有prepared语句参数的情况下运行查询时,它会返回正确的结果,正如通过QSqlQuery::next()
executedQuery()
报告说,“:username”
实际上没有被参数替换,而是被一个?
替换(由于查询没有成功执行,应该是这样吗?)
db
是一个QSqlDatabase类变量,并且isOpen()
报告true
。Qt框架verison是4.7.3
DBSql::userInfo(const QString &username,
QString &passwd,
QString &name,
UserPriv priv)
{
QSqlQuery userQuery(db_);
const QString userStr("SELECT u.id, u.fullname, u.password, p.description \
FROM users u INNER JOIN privilege p ON u.privilege_id = p.id \
WHERE u.username = :username");
userQuery.bindValue(":username", username);
if (!userQuery.prepare(userStr))
std::cout << "prepare failed" << std::endl;
if (userQuery.exec()) {
while (userQuery.next()) {
userId = userQuery.value(0).toInt();
name = userQuery.value(1).toString();
passwd = userQuery.value(2).toString();
const QString privilegeDesc = userQuery.value(3).toString();
}
}
}
DBSql::userInfo(const QString和username,
QString和passwd,
q字符串和名称,
用户权限(priv)
{
QSqlQuery用户查询(db_2;);
const QString userStr(“选择u.id、u.fullname、u.password、p.description\
来自用户的u内部加入权限p ON u.privilege\u id=p.id\
其中u.username=:username“;
userQuery.bindValue(“:username”,username);
如果(!userQuery.prepare(userStr))
std::cout您必须在userQuery->bindValue(“:username”,username)
之前调用userQuery->prepare(userStr)
尝试在绑定值之前调用prepare方法您正在泄漏您的QSqlQuery资源。您可能应该使用一个简单的自动变量:QSqlQuery userQuery(db)
已编辑,谢谢。它最初不是用堆分配编写的,但我尝试这样做,作为一种不顾一切的最后手段,以查看行为是否发生了变化。您是对的,先生。已确认。:)我如何投票支持您的答案?它说我需要15个声誉才能这样做。