首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C MySQL连接器-错误2014 -使用调用时命令不同步

问C MySQL连接器-错误2014 -使用调用时命令不同步
EN

Stack Overflow用户
提问于 2015-03-23 21:25:41
回答 2查看 1.5K关注 0票数 2

我们正在做一项任务。我们目前正在试图调用MySQL数据库中的一个远程过程,但是我们得到了一个2014年的错误,我们不知道原因。我们应该注意到,调用是成功的,我们得到了预期的结果,问题在于调用mysql_stmt_close(stmt)。我们使用mysql_free_result释放每个通过调用连接器生成的MYSQL结构,但是错误仍然存在。错误来自于mysql_stmt_close(stmt)调用,我们将得到一个2014年的错误,如标题中所述。尽我们所能看到,我们正在释放每个MYSQL结构。

守则主要取自互联网上的例子:

代码语言:javascript
复制
int basedatos_crearUsuario(char * pNombre, MYSQL * pConeccion){
char * query = "CALL crearUsuario (?)";
MYSQL_STMT *stmt;
MYSQL_BIND ps_params[1];  /* input parameter buffers */
MYSQL_BIND bind_results[1];

stmt = mysql_stmt_init(pConeccion);
if (!stmt)
{
    printf("Could not initialize statement\n");
    return -1;
}
if (mysql_stmt_prepare(stmt, query, strlen(query))){
    fprintf(stderr, "Error: %s (errno: %d)\n",mysql_error(pConeccion), mysql_errno(pConeccion));
    return -1;
}

long largo = (long) strlen(pNombre);
memset(ps_params, 0, sizeof (ps_params));
ps_params[0].buffer_type = MYSQL_TYPE_STRING;
ps_params[0].buffer = pNombre;
ps_params[0].buffer_length = largo;
ps_params[0].length = &largo;
ps_params[0].is_null = 0;

if(mysql_stmt_bind_param(stmt, ps_params)){
    fprintf(stderr, "Error: %s (errno: %d)\n",mysql_error(pConeccion), mysql_errno(pConeccion));
    return -1;
}
if (mysql_stmt_execute(stmt)){
    fprintf(stderr, "Error: %s (errno: %d)\n",mysql_error(pConeccion), mysql_errno(pConeccion));
    return -1;
}
MYSQL_RES* temp;
if (temp = mysql_stmt_store_result(stmt)) { //
    fprintf(stderr, " mysql_stmt_execute(), 1 failed\n");
    fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
    return -1;
}
MYSQL_RES* aRes = mysql_stmt_result_metadata(stmt);//

MYSQL_FIELD* aField = &(aRes->fields[0]); 
int totalrows = mysql_stmt_num_rows(stmt);

int resultadoQuery;
long largo2 = 0;
memset (bind_results, 0, sizeof (bind_results));
bind_results[0].buffer_type= aField->type;
bind_results[0].is_null= 0;
bind_results[0].buffer= (char *) &resultadoQuery;
bind_results[0].buffer_length= 255;
bind_results[0].length= &largo2;

mysql_stmt_bind_result(stmt, bind_results);  
while(!mysql_stmt_fetch(stmt)){
    printf("hay result");
}

mysql_free_result(aRes);
mysql_free_result(temp);
if (mysql_stmt_close(stmt)) //HERE: the stmt_close call returns an error.
{
  fprintf(stderr, " usuario failed while closing the statement\n");
  fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
  exit(0);
}

return resultadoQuery;

对于这种情况发生的原因,我们将不胜感激。连接也启用了CLIENT_MULTI_RESULTS标志。我们看过其他几个类似的问题,但是我们似乎已经启用了标志,并且调用的顺序是正确的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-27 14:55:54

请参阅以下文档:https://dev.mysql.com/doc/refman/5.6/en/mysql-store-result.html https://dev.mysql.com/doc/refman/5.6/en/c-api-multiple-queries.html https://dev.mysql.com/doc/refman/5.6/en/mysql-next-result.html (可能是最有用的链接)

CALL语句最有可能返回多个结果集,通常,如果在过程中运行返回数据的SELECT,则为查询获得一个结果集,然后为过程执行本身获得第二个结果集。

您需要提前到该过程的下一个结果集,并对其进行处理(或将其丢弃)。

我会在mysql_next_result上循环,然后在mysql_free_result之后和mysql_stmt_close之前丢弃它们。

票数 3
EN

Stack Overflow用户

发布于 2015-04-01 08:10:41

还可以尝试调试存储过程。

  1. 检查存储过程中是否有返回多行的select语句
  2. 检查存储过程中是否有忘记删除的日志语句,即标准输出或选择1,选择2类型语句。 如果(temp = mysql_stmt_store_result(stmt))

mysql_stmt_store_result不返回MYSQL_RES。可能temp是空的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29220713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档