mysql C API - mysql_stmt_fetch 抛出异常:访问冲突写入 0x00000008 [英] mysql C API - mysql_stmt_fetch throw exception: access violation write at 0x00000008

查看:88
本文介绍了mysql C API - mysql_stmt_fetch 抛出异常:访问冲突写入 0x00000008的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我收到node.exe 中 0x0369AF03 (libmysql.dll) 处未处理的异常:0xC0000005:访问冲突写入位置 0x00000008."在循环中使用 mysql C API 时出现错误消息.

I'm getting "Unhandled exception at 0x0369AF03 (libmysql.dll) in node.exe: 0xC0000005: Access violation writing location 0x00000008." error message while using mysql C API in a loop.

环境:Windows 7 32 位,Mysql 5.6

Environment: Windows 7 32bit, Mysql 5.6

错误只发生在Debug模式,在release模式下,它通过并获取结果,这很奇怪.

The error only occurs in Debug mode, in release mode, it passed and fetched result, this is very weird.

我用谷歌搜索,并设置了 STMT_ATTR_CURSOR_TYPE,但它是一样的

I googled, and set the STMT_ATTR_CURSOR_TYPE, but it's the same

请指教,谢谢!

代码:

准备声明

  static const char *sql_odb_read =
    "SELECT `type`, `size`, UNCOMPRESS(`data`) FROM GIT_ODB WHERE `repo` = ? AND `oid` = ?;";
  mysql->odb_read = mysql_stmt_init(mysql->db);
  if (mysql->odb_read == NULL)
    return GIT_ERROR;

  if (mysql_stmt_prepare(mysql->odb_read, sql_odb_read, strlen(sql_odb_read)) != 0)
    return GIT_ERROR;

  if (mysql_stmt_attr_set(mysql->odb_read, STMT_ATTR_UPDATE_MAX_LENGTH, &truth) != 0)
    return GIT_ERROR;

  if (mysql_stmt_attr_set(mysql->odb_read, STMT_ATTR_CURSOR_TYPE, (const void *)&type) != 0)
      return GIT_ERROR;

执行语句

 // bind the repo passed to the statement
  bind_buffers[0].buffer = &(backend->mysql->repo);
  bind_buffers[0].buffer_length = sizeof(backend->mysql->repo);
  bind_buffers[0].length = &bind_buffers[0].buffer_length;
  bind_buffers[0].buffer_type = MYSQL_TYPE_LONGLONG;

  // bind the oid passed to the statement
  bind_buffers[1].buffer = (void*)oid->id;
  bind_buffers[1].buffer_length = 20;
  bind_buffers[1].length = &bind_buffers[1].buffer_length;
  bind_buffers[1].buffer_type = MYSQL_TYPE_BLOB;

if (mysql_stmt_bind_param(backend->mysql->odb_read, bind_buffers) != 0)
      return GIT_ERROR;

  // execute the statement
  if (mysql_stmt_execute(backend->mysql->odb_read) != 0)
      return GIT_ERROR;

  if (mysql_stmt_num_rows(backend->mysql->odb_read) == 1) {
    result_buffers[0].buffer_type = MYSQL_TYPE_TINY;
    result_buffers[0].buffer = type_p;
    result_buffers[0].buffer_length = sizeof(type_p); //sizeof(signed char);
    result_buffers[0].is_null = 0;
    result_buffers[0].length = &type_len;
    memset(type_p, 0, sizeof(type_p));

    result_buffers[1].buffer_type = MYSQL_TYPE_LONGLONG;
    result_buffers[1].buffer = len_p;
    result_buffers[1].buffer_length = sizeof(len_p);
    result_buffers[1].is_null = 0;
    result_buffers[1].length = &len_len;
    memset(len_p, 0, sizeof(len_p));

    result_buffers[2].buffer_type = MYSQL_TYPE_LONG_BLOB;
    result_buffers[2].buffer = 0;
    result_buffers[2].is_null = 0;
    result_buffers[2].buffer_length = 0;
    result_buffers[2].length = &data_len;

    if (mysql_stmt_bind_result(backend->mysql->odb_read, result_buffers) != 0)
      return GIT_ERROR;

error = mysql_stmt_fetch(backend->mysql->odb_read);

推荐答案

我下载了libmysql符号和源文件并调试进去mysql_stmt_execute 后,结果缓冲区被更改,我不知道为什么,这是 libmysql 错误?所以我在使用结果缓冲区之前移动了 mem_set,然后一切正常

i downloaded libmysql symbol and source file and debugged into it after mysql_stmt_execute, result buffer is changed, i don't know why, it's libmysql bug? so i moved mem_set right before i use result buffer, then it's all working fine

这篇关于mysql C API - mysql_stmt_fetch 抛出异常:访问冲突写入 0x00000008的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆