6 Stimmen

Connector/C++ MySQL-Fehlercode: 2014 , SQLState: HY000 und Commands out of sync error warum?

Hallo, ich benutze Connector/C++ und führe 2 einfache Sql-Befehle wie diesen aus: Der erste Select Sql-Befehl läuft gut, aber der zweite verursacht diesen Ausnahmefehler:

ERR: Commands out of sync; Sie können diesen Befehl jetzt nicht ausführen (MySQL Fehlercode: 2014, SQLState: HY000 )

Hier ist der Code:

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

NEUEN CODE WIE VORGESCHLAGEN AKTUALISIEREN (FUNKTIONIERT NICHT)

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;

            }
        }

Dies ist mein einfacher Tisch:

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

0 Stimmen

Gibt es irgendwelche TRIGGER auf dem Tisch?

0 Stimmen

Keine sehr einfache Tabelle für die Prüfung

3voto

Mat Punkte 195740

Sie können nicht mehr als eine aktive Abfrage gleichzeitig auf einer Verbindung haben.

Von der mysql_use_result docs:

Sie dürfen mysql_data_seek(), mysql_row_seek(), mysql_row_tell(), mysql_num_rows(), oder mysql_affected_rows() nicht mit einem von mysql_use_result() zurückgegebenen Ergebnis benutzen, noch dürfen Sie andere Abfragen stellen, bis mysql_use_result() beendet ist .

Das ist nicht genau das, was Sie verwenden, aber das Problem ist das gleiche - Sie müssen die Verarbeitung der ersten ResultSet und bereinigen Sie sie, bevor Sie eine andere Abfrage für diese Verbindung durchführen können.

2voto

xinthose Punkte 2462

Ich erhielt denselben Fehler, bis ich meinen Code so änderte, dass er MySQL sagt, Sie sollen es tun .
Alter Code:

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

neuer Code ohne Fehler:

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" muss immer bei Rückgaben von Stored Procedures verwendet werden

1voto

Andy Braham Punkte 8849

Ich bin auch auf dieses Problem gestoßen und habe eine Weile gebraucht, um es herauszufinden. Ich hatte sogar die Einstellungen "CLIENT_MULTI_RESULTS" und "CLIENT_MULTI_STATEMENTS" vorgenommen, ohne Erfolg.

MySql geht davon aus, dass eine weitere Ergebnismenge darauf wartet, vom ersten Aufruf der Abfrage gelesen zu werden. Wenn Sie dann versuchen, eine weitere Abfrage auszuführen, denkt MySql, dass es noch ein ResultSet vom letzten Mal hat und sendet den Fehler "Out of Sync".

Es sieht so aus, als ob es sich um ein C++ Connector-Problem handeln könnte, aber ich habe eine Lösung gefunden und wollte sie posten, falls jemand anderes das gleiche Problem hat:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X