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

General Tech Bugs & Fixes 2 years ago

0 2 0 0 0 tuteeHUB earn credit +10 pts

5 Star Rating 1 Rating

Posted on 16 Aug 2022, this text provides information on Bugs & Fixes related to General Tech. Please note that while accuracy is prioritized, the data presented might not be entirely correct or up-to-date. This information is offered for general knowledge and informational purposes only, and should not be considered as a substitute for professional advice.

Take Quiz To Earn Credits!

Turn Your Knowledge into Earnings.

tuteehub_quiz

Answers (2)

Post Answer
profilepic.png
manpreet Tuteehub forum best answer Best Answer 2 years ago

 

I have a stored procedure, which inserts one record into a table and returns the last inserted id. When I call it com/tag/multiple">multiple com/tag/times">times in the C++ connector, on the 2nd time, it always fails with "Commands out of sync; you can't run this command now". The first insertion is successful and the inserted id can be fetched back.

I have closed and deleted the "sql::ResultSet" object after the first call, but it has no use. In some other posts, I saw that you need to call com/tag/statement">statement's "next_result()" before the 2nd call, but in the C++ connector's Statement class, there is no such function.

stored procedure:

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 = com/tag/statement">statement->executeQuery(sql_query);
    res->close();
    delete res;
    // the second call always fails 
    res = com/tag/statement">statement->executeQuery(sql_query);
}
profilepic.png
manpreet 2 years ago

Try to flush the ResultSet before calling executeQuery again, failing which, the command-out-of-sync nightmare may come. Deleting the Resultset will not serve the purpose. In your case since the stored procedure is not returning anything, you can try the following snippet:

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

Suppose, your stored procedure returned an integer, you could have used like so:

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

0 views   0 shares

No matter what stage you're at in your education or career, TuteeHub will help you reach the next level that you're aiming for. Simply,Choose a subject/topic and get started in self-paced practice sessions to improve your knowledge and scores.