【问题标题】:Stack Corruption Warning in C++ using mysql C API prepared statement使用 mysql C API 准备语句的 C++ 中的堆栈损坏警告
【发布时间】:2014-08-08 21:47:58
【问题描述】:

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

如果我想检索结果(例如简单的长 ID),我会收到来自 Visual Studio 调试器的警告,即我的 ID 变量周围的堆栈已损坏。

页眉 bool RunPreparedStatement(std::string query, std::vector paramList, std::string& errbuf, int* affected_rows, bool fetchResultID = false, int32* result_id=0, bool fetchInsertID = false, int32* last_insert_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 方法完成后立即收到警告。

【问题讨论】:

  • RunPreparedStatement 接受 8 个参数,你只用 6 个参数调用它。
  • 抱歉标题是 bool RunPreparedStatement(std::string query, std::vector paramList, std::string& errbuf, int* affected_rows, bool fetchResultID = false, int32* result_id=0 , bool fetchInsertID = false, int32* last_insert_id=0);
  • 不要在评论中发布,编辑问题。
  • 我已经这样做了,仅供参考

标签: c++ mysql


【解决方案1】:

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

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

我告诉结果类型是 MYSQL_TYPE_LONGLONG 但我只给它一个 int32 (unsigned int) 而不是 unsigned long long。

所以要么更改为 MYSQL_TYPE_LONG 要么增加 var 大小。

【讨论】:

    猜你喜欢
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多