我只想从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
不正确文档会说:
mySQL 5在SQL级别引入存储过程支持,但没有API 控制,输入和INOUT参数。因此,参数必须 使用sql命令而不是qsqlquery :: bindvalue((。
设置并读取
我们如何通过Q1设法完成工作?
我正在使用Qt5.8
MySQL 8.0.17
MySQL Connector C 6.1
使用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()
两个对我来说都很好。我知道使用位置时使用命名的占位符占位符,这是可取的。