您好我正在使用Connector / C ++并执行简单的2 sql命令,如下所示: 第一个选择sql运行正常,但第二个导致此异常错误:
错误:命令不同步;你现在不能运行这个命令(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
答案 0 :(得分:3)
一次连接上不能有多个活动查询。
来自mysql_use_result
文档:
您可能不会将mysql_data_seek(),mysql_row_seek(),mysql_row_tell(),mysql_num_rows()或mysql_affected_rows()与mysql_use_result(),返回的结果一起使用,也不会发出其他查询,直到mysql_use_result()有完成强>
这不完全是你正在使用的,但问题是相同的 - 你需要完成处理第一个ResultSet
并清理它,然后才能在该连接上发出任何其他查询。
答案 1 :(得分:1)
在我将代码更改为MySQL says to do it之前,我遇到了同样的错误 旧代码:
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”必须始终与Stored Procedures的退货一起使用
答案 2 :(得分:0)
我也遇到了这个问题并花了一点时间才弄明白。我甚至设置了“CLIENT_MULTI_RESULTS”和“CLIENT_MULTI_STATEMENTS”但没有用。
发生的事情是MySql认为还有另一个结果集等待从第一次调用Query中读取。然后,如果您尝试运行另一个Query,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 ***/
}