Connector / C++ MySQL код ошибки: 2014, SQLState: HY000 и команды из ошибки синхронизации почему?
Привет im с помощью Connector / C++ и выполнение простых команд 2 sql, как это : первый выберите sql run ok, но второй вызывает эту ошибку исключения:
ERR: команды не синхронизированы; вы не можете запустить этот comman D сейчас (MySQL код ошибки: 2014, SQLState: HY000)
вот код :
//member of the class
ResultSet *temp_res;
// in different method
m_driver = get_driver_instance();
m_con = m_driver->connect(m_DBhost,m_User,m_Password);
m_con->setSchema(m_Database);
//here i excute the querys :
vector<string> query;
query.push_back("SELECT * FROM info_tbl");
query.push_back("INSERT INTO info_tbl (id,name,age)VALUES (0,foo,36)");
query.push_back("SELECT * FROM info_tbl");
ResultSet *res;
Statement *stmt;
bool stmtVal = false;
try{
stmt = m_con->createStatement();
for(size_t i = 0;i < querys.size();i++)
{
string query = querys.at(i);
stmtVal = stmt->execute(query);
if(!stmtVal)
{
string error_log ="sql statment:";
error_log.append(query);
error_log.append(" failed!");
cout << error_log << endl;
break;
}
}
if(stmtVal)
{
if(returnSet)
{
res = stmt->getResultSet();
temp_res = res;
}
}
delete stmt;
//close connection to db
m_con->close();
} catch (sql::SQLException &e) {
......
}
ОБНОВИТЬ НОВЫЙ КОД, КАК ПРЕДЛОЖЕНО (НЕ РАБОТАЕТ )
for(size_t i = 0;i < querys.size();i++)
{
string query = querys.at(i);
stmtVal = stmt->execute(query);
if(stmtVal)
{
if(returnSet)
{
if(stmt->getResultSet()->rowsCount() > 0)
{
res = stmt->getResultSet();
temp_res = res;
}
else
{
delete res;
}
}
else
{
delete res;
}
}
if(!stmtVal)
{
string error_log ="sql statment:";
error_log.append(query);
error_log.append(" failed!");
cout << error_log << endl;
break;
}
}
Это моя простая таблица :
Column Type Null
id int(10) No
name varchar(255) No
age int(10) No
3 ответов
вы не можете иметь более одного активного запроса на соединение одновременно.
С mysql_use_result
docs:
вы не можете использовать mysql_data_seek(), mysql_row_seek(), mysql_row_tell(), mysql_num_rows(), или mysql_affected_rows() с результатом вернулся из mysql_use_result(), и вы не можете выдавать другие запросы, пока mysql_use_result () не закончит.
это не совсем то, что вы используете, но проблема остается то же самое - вам нужно будет закончить обработку первого ResultSet
и очистите его, прежде чем вы сможете выполнить любой другой запрос по этому соединению.
Я получал ту же ошибку, пока я не изменил свой код на how MySQL говорит сделать это.
Старый код:
res.reset(stmt->getResultSet());
if (res->next())
{
vret.push_back(res->getDouble("VolumeEntered"));
vret.push_back(res->getDouble("VolumeDispensed"));
vret.push_back(res->getDouble("Balance"));
}
новый код без ошибок:
do
{
res.reset(stmt->getResultSet());
while(res->next())
{
vret.push_back(res->getDouble("VolumeEntered"));
vret.push_back(res->getDouble("VolumeDispensed"));
vret.push_back(res->getDouble("Balance"));
}
} while (stmt->getMoreResults());
"do while" всегда должен использоваться с возвратами хранимых процедур
я столкнулся с этой проблемой и взял меня немного, чтобы выяснить это. Я даже установил "CLIENT_MULTI_RESULTS" и "CLIENT_MULTI_STATEMENTS" безрезультатно.
что происходит, MySql думает, что есть еще один результирующий набор, ожидающий чтения от первого вызова запроса. Затем, если вы попытаетесь запустить другой запрос, MySql думает, что у него все еще есть ResultSet с прошлого раза и отправляет ошибку "Out of Sync".
похоже, что это может быть 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 ***/
}