多次调用存储过程时C++连接器"Commands out of sync" mySQL

mySQL C++ connector "Commands out of sync" while calling stored procedure multiple times

本文关键字:Commands out sync mySQL of 连接器 调用 存储过程 C++      更新时间:2023-10-16

我有一个存储过程,它将一条记录插入到表中并返回最后插入的 id。 当我在 C++ 连接器中多次调用它时,第 2 次,它总是失败并显示"命令不同步;您现在无法运行此命令"。 第一次插入成功,可以找回插入的 id。

我在第一次调用后关闭并删除了"sql::ResultSet"对象,但它没有用。 在其他一些帖子中,我看到您需要在第二次调用之前调用语句的"next_result()",但在C++连接器的 Statement 类中,没有这样的函数。

存储过程:

PROCEDURE `insert_into_table`(IN ...)
BEGIN
INSERT INTO MyTable (...) VALUES (...);
SELECT LAST_INSERT_ID() AS id;
END

C++:

sql_query = "call insert_into_table(...);";
{
auto res = statement->executeQuery(sql_query);
res->close();
delete res;
// the second call always fails 
res = statement->executeQuery(sql_query);
}

在再次调用 executeQuery 之前尝试刷新 ResultSet,否则,命令不同步的噩梦可能会到来。删除结果集将不起作用。在您的情况下,由于存储过程未返回任何内容,因此可以尝试以下代码片段:

res = statement->executeQuery(sql_query);
while (res->next())
{       
}

假设您的存储过程返回了一个整数,您可以这样使用:

res = statement->executeQuery(sql_query);
while (res->next())
{
return res->getInt(1);       
}

现在,我知道这可能是晚了两年,我完全是在复制其他人对另一个与您类似的问题的回答。但它并没有被选为应有的"答案"。就像第三个下来一样。

所以谢谢 https://stackoverflow.com/users/1601882/andy-braham

第三个左右的答案在这里,如果你喜欢我的答案,请在那里投票给他。

连接器/C++ MySQL 错误代码:2014 、SQLState:HY000 和命令不同步错误为什么?

我也遇到了这个问题,花了一点时间才弄清楚。我什至设置了"CLIENT_MULTI_RESULTS"和"CLIENT_MULTI_STATEMENTS",但无济于事。

正在发生的事情是MySql认为还有另一个结果集等待从第一次调用查询中读取。然后,如果您尝试运行另一个查询,MySql 会认为它仍然具有上次的结果集并发送"不同步"错误。

这看起来可能是C++连接器问题,但我找到了解决方法,并希望发布它,以防其他人遇到同样的问题:

sql::PreparedStatement *sqlPrepStmt;
sql::ResultSet *sqlResult;
int id;
std::string name;
try {
//Build the Query String
sqlStr = "CALL my_routine(?,?)";
//Get the Result
sqlPrepStmt = this->sqlConn->prepareStatement(sqlStr);
sqlPrepStmt->setInt(1, itemID);
sqlPrepStmt->setInt(2, groupId);
sqlPrepStmt->executeUpdate();
sqlResult = sqlPrepStmt->getResultSet();
//Get the Results
while (sqlResult->next()) {
id = sqlResult->getInt("id");
name = sqlResult->getString("name");
}
//Workaround: Makes sure there are no more ResultSets
while (sqlPrepStmt->getMoreResults()) {
sqlResult = sqlPrepStmt->getResultSet();
}
sqlResult->close();
sqlPrepStmt->close();
delete sqlResult;
delete sqlPrepStmt;
}
catch (sql::SQLException &e) {
/*** Handle Exception ***/
}