使用MySQL> 5和QSqlQuery将值绑定到存储过程?

时间:2019-07-28 12:10:32

标签: mysql qt qt5 qsqlquery qsqldatabase

我只想从Qt端运行这种类型的过程:

DROP PROCEDURE IF EXISTS get_patient_info_brief;
DELIMITER //
CREATE PROCEDURE get_patient_info_brief(IN _id int)
BEGIN
    SELECT age, height, weight, sessions, remaining_sessions, `description` FROM patient_info WHERE `id` = _id;
END //
DELIMITER ;

像这样:

const auto q1 = QString("CALL get_patient_info_brief(?);");
const auto q2 = QStringLiteral("SELECT age, height, weight, sessions, remaining_sessions, `description` FROM patient_info WHERE `id` = ?;");

auto db = QSqlDatabase::addDatabase("QMYSQL");
db.setDatabaseName("mydb");
db.setUserName("root");
db.setPassword("pswd");
if (db.open()) {
    QSqlQuery q(db);
    q.prepare(q2);
    q.addBindValue(QVariant(1));
    if (q.exec()) {
        qDebug() << "query executed";
        if (q.size()) {
            while (q.next()) {
                qDebug() << q.record();
            }
        }
    }
}

如果我使用q2,则结果将返回,但对于q1则不正确

Docs会说:

  

MySQL 5引入了SQL级别的存储过程支持,但没有API   控制IN,OUT和INOUT参数。因此,参数必须   可以使用SQL命令而不是QSqlQuery :: bindValue()进行设置和读取。

我们如何才能成功地完成第一季度的工作?

我正在使用Qt5.8 + MySQL 8.0.17 + MySQL Connector C 6.1

1 个答案:

答案 0 :(得分:0)

使用PyQt5有两种方法可以在PyQt5中调用存储过程,并且两种方法都可以 工作。我想即使我没有尝试过,这些也可以在Qt中使用。

q.exec("CALL get_patient_info-brief ({})".format(1)

q.prepare("CALL get_patient_info-brief (:id)")
q.bindValue(":id", 1)
q.exec()

两者对我来说都很好。我了解使用位置 使用named的占位符 占位符。

相关问题