使用 QSqlQuery 检索 MySQL 个存储过程的输出
Retrieving output of MySQL stored procedures with QSqlQuery
我有一个 MySQL 服务器和 运行。它包含带有程序的数据库。这是其中之一:
CREATE PROCEDURE `handshake` ()
BEGIN
DECLARE `is_new` INT;
SELECT `value` INTO `is_new` FROM `Defaults` WHERE `key` = 'new_db';
SELECT (SELECT CASE
WHEN `is_new` = 1 THEN 1
WHEN `is_new` = 0 THEN 0
WHEN `is_new` = NULL THEN -1
ELSE -2
END) AS 'state';
END
它通过 MySQL Workbench 和 return 的单列(状态)table 工作,一行值为 1。但是当我尝试像这样使用它:
QSqlQuery test_query(test_db);
if (test_query.prepare("CALL handshake();")) {
qDebug() << "one";
if (test_query.exec()) {
qDebug() << "two";
if (test_query.first()) {
qDebug() << "Yay!";
}
else {
qDebug() << test_query.isValid() << test_query.size() << test_query.lastError().text();
}
}
}
它returns:
false -1 " "
这意味着:无效且没有记录但没有错误...
我试图 google 它但没有运气。 QSqlQuery
甚至支持这个吗?我可以创建 OUT 参数和 "SELECT CASE into it" 但我想用 return tables 创建其他过程,而不仅仅是单个参数...
程序returns无效。它仅具有处理作用。您应该为您的过程使用输出参数:
create procedure handshake (OUT state INT)
BEGIN
SELECT `value` INTO `is_new` FROM `Defaults` WHERE `key` = 'new_db';
set state = (SELECT CASE
WHEN `is_new` = 1 THEN 1
WHEN `is_new` = 0 THEN 0
WHEN `is_new` = NULL THEN -1
ELSE -2
END);
END
您可以调用该过程并读取值,如:
QSqlQuery q;
q.exec("call handshake (@outval1)");
q.exec("select @outval1");
q.next();
qDebug() << q.value(0);
我有一个 MySQL 服务器和 运行。它包含带有程序的数据库。这是其中之一:
CREATE PROCEDURE `handshake` ()
BEGIN
DECLARE `is_new` INT;
SELECT `value` INTO `is_new` FROM `Defaults` WHERE `key` = 'new_db';
SELECT (SELECT CASE
WHEN `is_new` = 1 THEN 1
WHEN `is_new` = 0 THEN 0
WHEN `is_new` = NULL THEN -1
ELSE -2
END) AS 'state';
END
它通过 MySQL Workbench 和 return 的单列(状态)table 工作,一行值为 1。但是当我尝试像这样使用它:
QSqlQuery test_query(test_db);
if (test_query.prepare("CALL handshake();")) {
qDebug() << "one";
if (test_query.exec()) {
qDebug() << "two";
if (test_query.first()) {
qDebug() << "Yay!";
}
else {
qDebug() << test_query.isValid() << test_query.size() << test_query.lastError().text();
}
}
}
它returns:
false -1 " "
这意味着:无效且没有记录但没有错误...
我试图 google 它但没有运气。 QSqlQuery
甚至支持这个吗?我可以创建 OUT 参数和 "SELECT CASE into it" 但我想用 return tables 创建其他过程,而不仅仅是单个参数...
程序returns无效。它仅具有处理作用。您应该为您的过程使用输出参数:
create procedure handshake (OUT state INT)
BEGIN
SELECT `value` INTO `is_new` FROM `Defaults` WHERE `key` = 'new_db';
set state = (SELECT CASE
WHEN `is_new` = 1 THEN 1
WHEN `is_new` = 0 THEN 0
WHEN `is_new` = NULL THEN -1
ELSE -2
END);
END
您可以调用该过程并读取值,如:
QSqlQuery q;
q.exec("call handshake (@outval1)");
q.exec("select @outval1");
q.next();
qDebug() << q.value(0);