用MySQL C++ API编写的语句栈损坏警告

用MySQL C++ API编写的语句栈损坏警告,c++,mysql,C++,Mysql,我有一个助手函数,用于在mysql中使用准备好的语句。只要我不想检索任何结果,一切都很好 如果我想检索一个结果,例如简单的长ID,我会从visual studio调试器收到一条警告,说我的ID变量周围的堆栈已损坏 标题 bool runpreparedstatementsd::string查询,std::vector参数列表,std::string&errbuf,int*受影响的行,bool fetchResultID=false,int32*result\u id=0,bool fetchIn

我有一个助手函数,用于在mysql中使用准备好的语句。只要我不想检索任何结果,一切都很好

如果我想检索一个结果,例如简单的长ID,我会从visual studio调试器收到一条警告,说我的ID变量周围的堆栈已损坏

标题 bool runpreparedstatementsd::string查询,std::vector参数列表,std::string&errbuf,int*受影响的行,bool fetchResultID=false,int32*result\u id=0,bool fetchInsertID=false,int32*last\u insert\u id=0

bool RunPreparedStatement(std::string sql, std::vector<MYSQL_BIND> paramList, std::string& errStr, int* affected_rows, bool fetchResultID, int32* result_id, bool fetchInsertID, int32* last_insert_id) {
char errbuf[MYSQL_ERRMSG_SIZE];

int numParams = paramList.size();

bool fetchResult = fetchResultID;

if(numParams == 0) {
    errStr = "0 parameters supplied";        
    return false;
}

MYSQL_STMT *stmt = mysql_stmt_init(&mysql);

if (!stmt) {
    errStr = "mysql_stmt_init(), out of memory";         
    return false;
}

if (mysql_stmt_prepare(stmt, sql.c_str(), sql.length())) {
    errStr =  "mysql_stmt_prepare() failed ";
    errStr.append(mysql_stmt_error(stmt));
    return false;
}

int param_count= mysql_stmt_param_count(stmt);

if (param_count != numParams) /* validate parameter count */{
    errStr = "invalid parameter count returned by MySQL";
    return false;
}

if (mysql_stmt_bind_param(stmt, &paramList[0])) {
    errStr = "mysql_stmt_bind_param() failed ";
    errStr.append(mysql_stmt_error(stmt));  
    return false;
}

int32 id = 0;
MYSQL_BIND resultParam1;    
BindValue(&resultParam1,MYSQL_TYPE_LONGLONG,&id,0,0,0);

if(fetchResult) {                       
     /* Bind the results buffer */
  if (mysql_stmt_bind_result(stmt,  &resultParam1) != 0) {      
    errStr = "mysql_stmt_bind_result() failed ";
    errStr.append(mysql_stmt_error(stmt));  
    return false;
  }
}

if (mysql_stmt_execute(stmt)) {
    errStr = "mysql_stmt_execute() failed ";
    errStr.append(mysql_stmt_error(stmt));          
    return false;
}

if(fetchResult) {

    if (mysql_stmt_store_result(stmt) != 0) {         
        errStr = "Could not buffer result set ";
        errStr.append(mysql_stmt_error(stmt));      
        return false;
    }

  if(mysql_stmt_fetch (stmt) == 0) {

      (*result_id) = id;

    // OK
      *affected_rows = 1;
  } else {      
      *affected_rows = 0;
    /*errStr = "no results found ";
    errStr.append(mysql_stmt_error(stmt));
    return false;*/
  }
} else {
    *affected_rows = mysql_stmt_affected_rows(stmt);        
}

if(fetchInsertID) {
    *last_insert_id= mysql_stmt_insert_id(stmt);
}

if(stmt != NULL) {

    // Deallocate result set
    mysql_stmt_free_result(stmt); /* deallocate result set */

     if (mysql_stmt_close(stmt)) {
         errStr = "closing the statement failed ";
         errStr.append(mysql_stmt_error(stmt));
        return false;
    }
}

return true;
}

我这样称呼它

std::string errBuf;
int affected_rows = 0;
std::string sql = "SELECT count(*) FROM name WHERE (?) like name";

std::vector<MYSQL_BIND> paramList;  
std::vector<MYSQL_BIND> resultParamList;

char data[1024];
safe_strncpy(data,name,sizeof(data), __FILE__, __LINE__);

MYSQL_BIND param1;  
BindValue(&param1,MYSQL_TYPE_STRING,data,strlen(data),0,0);
paramList.push_back(param1);    

int32 count = 0;    

bool ret = true;

if(RunPreparedStatement(sql,paramList,errBuf,&affected_rows,true,&count)){
 ...
}
我以前也有一个resultParamList,而不是简单的ID,并且有相同的错误,认为它与返回一个值列表有关,但事实并非如此


RunPreparedStatement方法一完成,我就会收到警告。

尝试另一个示例代码,我发现了问题

int32 id = 0;
MYSQL_BIND resultParam1;    
BindValue(&resultParam1,MYSQL_TYPE_LONGLONG,&id,0,0,0);
我告诉你结果类型是MYSQL\u type\u LONGLONG,但是我只给它一个int32 unsigned int而不是unsigned long


因此,要么更改为MYSQL\u TYPE\u LONG,要么增加变量大小。

RunPreparedStatement接受8个参数,您只能用6个参数调用它。很抱歉,标题是bool RunPreparedStatementstd::string query,std::vector paramList,std::string&errbuf,int*受影响的行,bool fetchResultID=false,int32*result\u id=0,bool fetchInsertID=false,int32*最后一次插入\u id=0;不要在评论中发布,编辑问题。我已经发布了,仅供参考