使用QSqlQuery检索MySQL存储过程的输出

时间:2015-04-13 02:00:51

标签: c++ mysql qt qsqlquery qsqldatabase

我已启动并运行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工作并返回一行(状态)表,其中一行值为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();
        }
    }
}

它返回:

  

false -1&#34; &#34;

表示:无效且没有记录但没有错误...... 我试图谷歌它,但没有运气。 QSqlQuery甚至支持这个吗?我可以创建OUT参数和&#34; SELECT CASE到它&#34;但是我想用返回表创建其他过程,而不仅仅是单个参数......

1 个答案:

答案 0 :(得分:0)

过程返回void。它只有一个处理角色。您应该为您的过程使用输出参数:

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);