我有一个存储过程,该过程将一条记录插入表中并返回最后插入的ID。 当我第二次在C ++连接器中调用它时,它总是失败,并显示“命令不同步;您现在不能运行此命令”。 第一次插入成功,插入的ID可被取回。
在第一次调用后,我已经关闭并删除了“ sql :: ResultSet”对象,但是它没有用。 在其他一些帖子中,我看到您需要在第二次调用之前调用statement的“ 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);
}
答案 0 :(得分:0)
在再次调用executeQuery之前尝试刷新ResultSet,否则可能会导致同步失控的噩梦。删除结果集将无法达到目的。在您的情况下,由于存储过程未返回任何内容,您可以尝试以下代码段:
res = statement->executeQuery(sql_query);
while (res->next())
{
}
假设您的存储过程返回一个整数,您可能会这样使用:
res = statement->executeQuery(sql_query);
while (res->next())
{
return res->getInt(1);
}
答案 1 :(得分:0)
现在,我知道这可能晚了两年,而且我完全复制了其他人对另一个与您类似的问题的回答。但它没有被选为“该”答案,因为它应该是。就像第三个一样。
谢谢 https://stackoverflow.com/users/1601882/andy-braham
这里有第三个回答,如果你喜欢我的回答,请在那里给他点赞。
Connector/C++ MySQL error code: 2014 , SQLState: HY000 and Commands out of sync error why?
我也遇到了这个问题,花了我一点时间才弄明白。我什至设置了“CLIENT_MULTI_RESULTS”和“CLIENT_MULTI_STATEMENTS”都无济于事。
发生的事情是 MySql 认为还有另一个结果集等待从第一次调用 Query 开始读取。然后,如果您尝试运行另一个 Query,MySql 认为它仍然具有上次的 ResultSet 并发送“不同步”错误。
这看起来可能是 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 ***/
}