用MySQL C++ API编写的语句栈损坏警告
我有一个助手函数,用于在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用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
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, ¶mList[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(¶m1,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;不要在评论中发布,编辑问题。我已经发布了,仅供参考