Connector / C ++ MySQL код ошибки: 2014, SQLState: HY000 и ошибки команд из-за синхронизации - PullRequest
6 голосов
/ 26 июля 2011

Привет, я использую Connector / C ++ и выполняю простые команды 2 sql следующим образом: первый выбор sql выполняется нормально, но второй вызывает эту ошибку исключения:

ERR: команды не синхронизированы;Вы не можете запустить этот командир d сейчас (MySQL error code: 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) {
    ......
}

ОБНОВИТЬ НОВЫЙ КОД ASПРЕДЛАГАЕТСЯ (НЕ РАБОТАЕТ)

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 ]

3 голосов
/ 26 июля 2011

Вы не можете иметь более одного активного запроса одновременно.

Из документов mysql_use_result:

Вы можетене используйте mysql_data_seek (), mysql_row_seek (), mysql_row_tell (), mysql_num_rows () или mysql_affered_rows () с результатом, возвращенным из mysql_use_result (), , и вы не можете выполнять другие запросы до тех пор, пока mysql_use_result () не будет завершен

Это не совсем то, что вы используете, но проблема та же - вам нужно закончить обработку первого ResultSet и очистить его, прежде чем вы сможете выполнить любой другой запрос на этомподключение.

1 голос
/ 29 сентября 2015

Я получал ту же ошибку, пока я не изменил свой код на 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" всегда должно использоваться с возвратами хранимых процедур

0 голосов
/ 22 января 2017

Я тоже столкнулся с этой проблемой и потратил немного времени, чтобы разобраться с ней.Я даже установил "CLIENT_MULTI_RESULTS" и "CLIENT_MULTI_STATEMENTS" безрезультатно.

То, что происходит, - MySql думает, что есть другой набор результатов, ожидающий чтения от первого вызова к Запросу.Затем, если вы попытаетесь запустить другой Query, MySql думает, что у него все еще есть ResultSet с прошлого раза, и отправляет ошибку «Out of Sync».

Похоже, это может быть проблема с C ++ Connector, но я нашелОбходной путь и хотел опубликовать его в случае, если кто-то еще имеет эту проблему:

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 ***/
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...