QSqlQuery 不是绑定值
QSqlQuery is not binding values
我正在对 MySQL 数据库执行查询,并在我的整个应用程序中使用类似于下面的代码。但出于某种原因,下面的更新说 0 行受影响,而它应该是 1。在深入挖掘时,我发现我的 bindValue 命令似乎没有任何效果。
QSqlQuery* query = new QSqlQuery(m_db)
query->prepare(QString("UPDATE companies SET "
"NAME=:name, "
"ISUSER=:isuser, "
"ISVAR=:isvar, "
"ISOEM=:isoem, "
"CONTACT=:contact, "
"EMAIL=:email, "
"COMMENTS=:comments "
"WHERE ID=:id "
"LIMIT 1"));
query->bindValue(":name",rowData.name);
query->bindValue(":isuser",rowData.isEndUser);
query->bindValue(":isvar",rowData.isVAR);
query->bindValue(":isoem",rowData.isOEM);
query->bindValue(":contact",rowData.contact);
query->bindValue(":email",rowData.email);
query->bindValue(":comments",rowData.comments);
query->bindValue(":id",id);
bool queryOk = query->exec();
if (queryOk) {
qDebug() << query->executedQuery();
qDebug() << query->lastQuery();
qDebug() << query->lastError().text();
qDebug() << rowsAffected;
上面的代码中一定有某些东西 different/wrong 导致了下面的输出:
"UPDATE companies SET NAME=:name, ISUSER=:isuser, ISVAR=:isvar, ISOEM=:iSOEM, CONTACT=:contact, EMAIL=:email, COMMENTS=:comments WHERE ID=:id LIMIT 1"
"UPDATE companies SET NAME=:name, ISUSER=:isuser, ISVAR=:isvar, ISOEM=:iSOEM, CONTACT=:contact, EMAIL=:email, COMMENTS=:comments WHERE ID=:id LIMIT 1"
""
0
但是我看不出问题所在,查询returns也没有错误。然而查询字符串似乎包含未替换的变量名。
QSqlQuery::executedQuery()
不会向您显示绑定值,因为绑定值的思想是它们永远不会成为查询本身的一部分(这完全消除了转义它们的问题)。您看到的 是 提交给数据库的实际查询。绑定值 连同 查询字符串一起提交给数据库(与 QSqlQuery 非常相似)。
至于 rowsAffected
为零,我没有看到它被您的示例中的代码初始化或更新,这可能是它说 0
的原因。您可能想改用 query->numRowsAffected()
。
最后(与你的任何问题无关),你不需要在堆上分配 QSqlQuery(除非你真的需要查询比创建它的范围长)并且你可以简单地分配它在堆栈上。更少的动态分配 == 更少的内存泄漏机会:-)
我正在对 MySQL 数据库执行查询,并在我的整个应用程序中使用类似于下面的代码。但出于某种原因,下面的更新说 0 行受影响,而它应该是 1。在深入挖掘时,我发现我的 bindValue 命令似乎没有任何效果。
QSqlQuery* query = new QSqlQuery(m_db)
query->prepare(QString("UPDATE companies SET "
"NAME=:name, "
"ISUSER=:isuser, "
"ISVAR=:isvar, "
"ISOEM=:isoem, "
"CONTACT=:contact, "
"EMAIL=:email, "
"COMMENTS=:comments "
"WHERE ID=:id "
"LIMIT 1"));
query->bindValue(":name",rowData.name);
query->bindValue(":isuser",rowData.isEndUser);
query->bindValue(":isvar",rowData.isVAR);
query->bindValue(":isoem",rowData.isOEM);
query->bindValue(":contact",rowData.contact);
query->bindValue(":email",rowData.email);
query->bindValue(":comments",rowData.comments);
query->bindValue(":id",id);
bool queryOk = query->exec();
if (queryOk) {
qDebug() << query->executedQuery();
qDebug() << query->lastQuery();
qDebug() << query->lastError().text();
qDebug() << rowsAffected;
上面的代码中一定有某些东西 different/wrong 导致了下面的输出:
"UPDATE companies SET NAME=:name, ISUSER=:isuser, ISVAR=:isvar, ISOEM=:iSOEM, CONTACT=:contact, EMAIL=:email, COMMENTS=:comments WHERE ID=:id LIMIT 1"
"UPDATE companies SET NAME=:name, ISUSER=:isuser, ISVAR=:isvar, ISOEM=:iSOEM, CONTACT=:contact, EMAIL=:email, COMMENTS=:comments WHERE ID=:id LIMIT 1"
""
0
但是我看不出问题所在,查询returns也没有错误。然而查询字符串似乎包含未替换的变量名。
QSqlQuery::executedQuery()
不会向您显示绑定值,因为绑定值的思想是它们永远不会成为查询本身的一部分(这完全消除了转义它们的问题)。您看到的 是 提交给数据库的实际查询。绑定值 连同 查询字符串一起提交给数据库(与 QSqlQuery 非常相似)。
至于 rowsAffected
为零,我没有看到它被您的示例中的代码初始化或更新,这可能是它说 0
的原因。您可能想改用 query->numRowsAffected()
。
最后(与你的任何问题无关),你不需要在堆上分配 QSqlQuery(除非你真的需要查询比创建它的范围长)并且你可以简单地分配它在堆栈上。更少的动态分配 == 更少的内存泄漏机会:-)