QSqlQuery工作错误

时间:2016-06-09 10:32:56

标签: database postgresql qt

有一些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。

0 个答案:

没有答案