2011-07-26 6 views
6

Hola im utilizando Conector/C++ y ejecutar 2 comandos SQL simple como esto: la primera seleccione ejecutar SQL bien, pero la segunda causa de este error de excepción:Conector/C++ Código de error de MySQL: 2014, SQLState: HY000 y Comandos de error de sincronización ¿por qué?

ERR: Commands out of sync; you can't run this comman d now (MySQL error code: 2014, SQLState: HY000)

aquí está el código:

//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) { 
    ...... 
} 

ACTUALIZACIÓN NUEVO CÓDIGO como se sugiere (no funciona)

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; 

      } 
     } 

esta es mi tabla simple:

Column Type  Null  
id   int(10)  No   
name varchar(255) No   
age  int(10)  No 
+0

¿Hay factores desencadenantes en la mesa? – Konerak

+0

no hay una tabla muy simple para probar – user63898

Respuesta

3

No puede tener más de una consulta activa en una conexión a la vez.

A partir de los documentos: mysql_use_result

You may not use mysql_data_seek(), mysql_row_seek(), mysql_row_tell(), mysql_num_rows(), or mysql_affected_rows() with a result returned from mysql_use_result(), nor may you issue other queries until mysql_use_result() has finished.

que no es exactamente lo que estás usando, pero el problema es el mismo - se necesita para terminar de procesar la primera ResultSet y limpiarla antes de poder emitir cualquier otra consulta en esa conexión.

+0

bien pero no obtengo ningún conjunto de resultados de la primera selección. también, ¿cuál es la forma correcta de limpiar ResultSet si no uso std :: auto_ptr? – user63898

+2

Tanto si obtiene datos como si no, debe llamar a 'res-> next()' hasta que devuelva 'false' (que puede estar en la primera llamada), o eliminar el ResultSet (con' delete res; ') . – Mat

+0

bien, lo intentaré – user63898

1

Me estaba dando el mismo error hasta que cambie mi código a cómo MySQL says to do it.
Código antiguo:

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")); 
} 

nuevo código W/O error:

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()); 

"hacer, mientras que" siempre se debe utilizar con rendimientos procedimientos almacenados

0

me encontré con este problema también, y Me tomó un poco de tiempo averiguarlo. Incluso había configurado "CLIENT_MULTI_RESULTS" y "CLIENT_MULTI_STATEMENTS" sin resultado.

Lo que está sucediendo es que MySql cree que hay otro conjunto de resultados esperando a ser leído desde la primera llamada a la consulta. Luego, si intenta ejecutar otra consulta, MySql piensa que todavía tiene un ResultSet desde la última vez y envía el error "Sin sincronización".

Esto parece que podría ser un asunto C++ Conector pero he encontrado una solución y quería publicarlo en caso de que alguien más está teniendo este mismo problema:

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 ***/ 
} 
Cuestiones relacionadas