C++ MySQL 连接器执行存储过程破坏连接
C++ MySQL connector execute stored procedure corrupts connection
在 MySQL 数据库中,我有一个由以下创建语句定义的存储过程:
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()
returns MySQL 连接器连接的副本,它使用 setAutoCommit(true)
设置并且适用于所有其他 select,插入,并更新查询。
成功调用该过程后,所有后续查询都失败并显示 MySQL error code: 2014, SQLState: "HY000"
为什么这个过程调用似乎使连接处于占用状态?
在 do-while 中封装调用解决了问题:
do {
// execute code
} while (stmt->getMoreResults());
在 MySQL 数据库中,我有一个由以下创建语句定义的存储过程:
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()
returns MySQL 连接器连接的副本,它使用 setAutoCommit(true)
设置并且适用于所有其他 select,插入,并更新查询。
成功调用该过程后,所有后续查询都失败并显示 MySQL error code: 2014, SQLState: "HY000"
为什么这个过程调用似乎使连接处于占用状态?
在 do-while 中封装调用解决了问题:
do {
// execute code
} while (stmt->getMoreResults());