C MySQL 连接器 - 错误 2014 - 使用 CALL 时命令不同步
C MySQL Connector - Error 2014 - Commands out of sync when using CALL
我们正在处理一项任务。
我们目前正在尝试调用 MySQL 数据库中的远程过程,但出现 2014 错误,我们无法弄清楚原因。我们应该注意到调用成功并且我们得到了我们期望得到的结果,问题出在对mysql_stmt_close(stmt)
的调用中。
我们正在使用 mysql_free_result
释放通过调用连接器生成的每个 MYSQL 结构,但错误仍然存在。错误来自 mysql_stmt_close(stmt)
调用,如标题中所述,我们收到 2014 年错误。据我们所知,我们正在释放所有可能的 MYSQL 结构。
代码大部分摘自网上的例子:
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 标志也为连接启用。我们已经查看了其他几个类似的问题,但我们似乎启用了标志并且调用顺序正确。
请参阅以下文档:
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(可能是最有用的link)
您的 CALL 语句很可能返回多个结果集,通常如果您 运行 一个 SELECT 那个 returns 过程中的数据,那么您会得到一个查询结果集,并且然后是过程执行本身的第二个结果集。
您需要前进到过程的下一个结果集,并处理它(或丢弃它)。
我会在 mysql_next_result 上循环,然后在 mysql_free_result 之后和 mysql_stmt_close 之前将它们扔掉。
也尝试调试您的存储过程
- 检查您的存储过程中是否有 select 语句 return 超过一行
检查您的存储过程中是否有您忘记删除的日志语句,即标准输出或select 1,select 2 类型语句.
if (temp = mysql_stmt_store_result(stmt))
mysql_stmt_store_result 不 return MYSQL_RES。可能 temp 为 null
我们正在处理一项任务。
我们目前正在尝试调用 MySQL 数据库中的远程过程,但出现 2014 错误,我们无法弄清楚原因。我们应该注意到调用成功并且我们得到了我们期望得到的结果,问题出在对mysql_stmt_close(stmt)
的调用中。
我们正在使用 mysql_free_result
释放通过调用连接器生成的每个 MYSQL 结构,但错误仍然存在。错误来自 mysql_stmt_close(stmt)
调用,如标题中所述,我们收到 2014 年错误。据我们所知,我们正在释放所有可能的 MYSQL 结构。
代码大部分摘自网上的例子:
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 标志也为连接启用。我们已经查看了其他几个类似的问题,但我们似乎启用了标志并且调用顺序正确。
请参阅以下文档: 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(可能是最有用的link)
您的 CALL 语句很可能返回多个结果集,通常如果您 运行 一个 SELECT 那个 returns 过程中的数据,那么您会得到一个查询结果集,并且然后是过程执行本身的第二个结果集。
您需要前进到过程的下一个结果集,并处理它(或丢弃它)。
我会在 mysql_next_result 上循环,然后在 mysql_free_result 之后和 mysql_stmt_close 之前将它们扔掉。
也尝试调试您的存储过程
- 检查您的存储过程中是否有 select 语句 return 超过一行
检查您的存储过程中是否有您忘记删除的日志语句,即标准输出或select 1,select 2 类型语句.
if (temp = mysql_stmt_store_result(stmt))
mysql_stmt_store_result 不 return MYSQL_RES。可能 temp 为 null