Connector/C++MySQL错误代码:2014,SQLState:HY000和命令不同步错误为什么?

Connector/C++MySQL错误代码:2014,SQLState:HY000和命令不同步错误为什么?,c++,mysql,client,C++,Mysql,Client,Hi im使用Connector/C++并执行以下简单的2个sql命令: 第一个选择sql运行正常,但第二个选择导致此异常错误: 错误:命令不同步;你现在不能运行这个命令 错误代码:2014,SQLState:HY000 代码如下: //member of the class ResultSet *temp_res; // in different method m_driver = get_driver_instance(); m_con = m_driver->conne

Hi im使用Connector/C++并执行以下简单的2个sql命令: 第一个选择sql运行正常,但第二个选择导致此异常错误:

错误:命令不同步;你现在不能运行这个命令 错误代码: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) {
    ......
}

一次连接上不能有多个活动查询

从文档中:

您不能使用mysql\u data\u seek、mysql\u row\u seek、mysql\u row\u tell、mysql\u num\u rows或mysql\u Infected\u rows并从mysql\u use\u result返回结果,也不能在mysql\u use\u result完成之前发出其他查询


这并不完全是您正在使用的,但问题是相同的-您需要完成对第一个结果集的处理并将其清理干净,然后才能对该连接发出任何其他查询。

在将代码更改为“如何”之前,我遇到了相同的错误。 旧代码:

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_结果和CLIENT_MULTI_语句,但都没有用

现在发生的事情是,MySql认为有另一个结果集正在等待从对查询的第一次调用读取。然后,如果您尝试运行另一个查询,MySql认为它仍然有上次的结果集,并发送不同步错误

<>这看起来像是一个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 ***/
}

表上有触发器吗?没有非常简单的用于测试的表,但是我没有从第一次选择中得到任何结果集。另外,如果我不使用std::auto_ptr,清理结果集的正确方法是什么?无论您是否获得任何数据,都需要调用res->next,直到它返回false(第一次调用时可能返回false),或者使用delete res;删除结果集;。当我尝试删除res时,它会给我访问权限冲突写入位置,我会更新代码以在更新的代码中显示您,如果returnSet为false或没有返回行,则您正在删除未初始化的指针。在这两种情况下,res未设置。不要那样做。非常感谢你的帮助
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());
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 ***/
}