有一些QSqlQuery示例。我认为这些例子必须以同样的方式运作。我用GDB和Wireshark调查了这段代码(我看了哪些查询提交给PostgreSQL服务器)。
示例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
方法时,查询标识符和参数向量将发送到服务器。服务器成功返回查询结果。
示例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
调用时提交。这是错的。
示例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')
服务器成功返回查询结果。然而,这是一个错误的行为,因为查询文本应该在prepare
调用和exec
上发送到服务器 - 查询标识符和参数向量。
那么,这个,错误或功能是什么?
Qt版本 - 5.6.1。
prepare
方法在所有示例中都返回true。