mySQL C ++连接器“命令不同步”,同时多次调用存储过程

时间:2019-04-11 10:31:53

标签: c++ mysql

我有一个存储过程,该过程将一条记录插入表中并返回最后插入的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);
}

2 个答案:

答案 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 ***/
}