有一些QSqlQuery示例 . 我认为这些例子必须以同样的方式运作 . 我用GDB和Wireshark调查了这段代码(我看了哪些查询提交给了PostgreSQL服务器) .

Example 1

数据库连接代码片段被省略 .

QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
db.open();
QSqlQuery q(db);
q.prepare("SELECT * FROM get_person(:user_name)");
q.bindValue(":user_name", "gagarin");
q.exec();

此示例工作正常 . 当调用 prepare 方法时,查询已获得文本标识符,并且此标识符和参数化查询已提交给服务器 . 调用 exec 方法时,查询标识符和参数向量将发送到服务器 . 服务器成功返回查询结果 .

Example 2

QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
QSqlQuery q(db);
db.open();
q.prepare("SELECT * FROM get_person(:user_name)");
q.bindValue(":user_name", "gagarin");
q.exec();

此示例工作错误 . 尽管QSqlQuery构造函数尚未打开数据库,但真正的数据库参数存储在全局工作空间中,而QSqlQuery通过连接名称获取它们,因此在QSqlQuery构造函数调用之前是否打开连接没有区别 . 所以,让我们看一下代码行为 . prepare 方法调用无效 . 调用 exec 方法时,会将此垃圾发送到服务器:

SELECT * FROM get_person('gagarin'

因此,服务器无法返回数据 . 如果查询没有参数,比如查询查询,它将被执行,但它将在 exec 调用时提交,但不会在 prepare 调用时提交 . 这是不对的 .

Example 3

QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
QSqlQuery q(db);
db.open();
q.prepare("SELECT * FROM get_person(:user_name)");
q.addBindValue("gagarin");
q.exec();

在这种情况下, prepare 方法调用也没有效果 . 并且在 exec 上调用查询已经构建没有错误 . 这是发送到服务器的查询:

SELECT * FROM get_person('gagarin')

Server成功返回查询结果 . 然而,这是一个错误的行为,因为查询文本应该在 prepare 调用时发送到服务器,并且在 exec 上 - 仅查询标识符和参数向量 .

那么,这个,错误或功能是什么?

Qt - 5.6.1的版本 .

prepare 方法在所有示例中都返回true .