多次调用存储过程时C++连接器"Commands out of sync" mySQL
mySQL C++ connector "Commands out of sync" while calling stored procedure multiple times
我有一个存储过程,它将一条记录插入到表中并返回最后插入的 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 ***/
}
- IN, OUT, INOUT Parameters
- 即使使用调试编译标志,表达式也是"optimized out"
- C++双重释放或损坏(out)
- 将 out/in out 参数与 if/switch 的 init 语句一起使用
- 在命令行上将输入显示到数组中时如何删除 ./a.out?
- 为什么我的向量::擦除调用会抛出"vector subscript out of range"?
- 解决方案在第 25 行执行错误'out of bounds'
- C++ 向量加减抛出"expression: vector subscript out of range."错误
- 对函数的 out 字符串参数使用 swap 与赋值
- 运行编译的 a.out 后出现分段错误(核心转储)错误
- 在 Metal 着色器代码中,如何定义函数的 in/out 参数变量?
- 赋值运算符上的双重释放或损坏(out)
- "in"和"out"在参数方向上是什么意思?
- 从 MSVC14 切换到 MSVC16 会导致"compiler is out of heap space (C1060)"错误
- -bash:/a.out:无法执行二进制文件:Exec格式错误
- 庞大的初始化列表,如何修复"fatal error C1060: compiler is out of heap space"
- C++ 调用析构函数后动态模板队列"double free or corruption (out)"
- 如何解决'vector subscript out of range'错误?
- 多次调用存储过程时C++连接器"Commands out of sync" mySQL
- MySQL:"Commands out of Sync"错误(C 连接器)