C++ MySQL 连接器执行存储过程破坏连接

时间:2021-04-08 15:33:26

标签: c++ mysql stored-procedures mysql-connector

在 MySQL 数据库中,我有一个由以下 create 语句定义的存储过程:

DROP procedure IF EXISTS `get_next_ticket_number`;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `get_next_ticket_number`()
BEGIN
SELECT IFNULL((SELECT `number`
FROM ticket
ORDER BY `number` DESC
LIMIT 1)+1, 1) as 'next_number';
END$$
DELIMITER ;

在 QT C++ 应用程序中,我试图调用该过程并稍后使用结果:

std::unique_ptr<sql::PreparedStatement> pstmt;
std::unique_ptr<sql::ResultSet> res;

int next_number = 0;

try
{
    pstmt.reset(dbConnection::getInstance()->getDb()->prepareStatement("CALL get_next_ticket_number();"));
    res.reset(pstmt->executeQuery());

    while(res->next()) {
        next_number = res->getInt("next_number");
    }

    dbConnection::getInstance()->getDb()->commit();    // For good measure...
}
catch (sql::SQLException &e)
{
    // Error logging here
}

getInstance()->getDb() 返回 MySQL 连接器连接的副本,该副本使用 setAutoCommit(true) 设置并且适用于所有其他选择、插入和更新查询。

成功调用该过程后,所有后续查询均失败并显示 MySQL error code: 2014, SQLState: "HY000"

为什么这个过程调用似乎让连接处于占用状态?

1 个答案:

答案 0 :(得分:0)

将调用包装在 do-while 中解决了问题:

do {
// execute code
} while (stmt->getMoreResults());