mysql - mysql_stmt_store_result 一次只返回一条记录

标签 mysql c

Win7下的MySQl 5.6,C API编写的语句。第一次使用mysql_stmt_store_result()

我准备了一个缓冲区来保存 40 条记录(例如,struct TICK ticks[40])。在绑定(bind)数组中,我设置了缓冲区中第一个结构体元素的地址(例如,bind.buffer = (char*)&ticks[0].elem1; 等)。在 bind.buffer_length 中,我为结构体的所有元素放入了缓冲区中的可用空间,例如 sizeof (ticks.elem1)*40。我还设置了绑定(bind)结构的其他一些元素。

我调用mysql_stmt_store_result(),然后调用mysql_stmt_fetch()。对mysql_stmt_fetch()的调用获取结果集的第一条记录并将其正确地放入ticks[0]中,但这就是它检索的全部内容。下一次调用 mysql_stmt_fetch() 会检索第二条记录,并将其覆盖在第一条记录上(在 ticks[0] 处),后续调用也会执行相同的操作。

我正在遵循 mysql 引用手册 mysql-stmt-fetch 中 mysql_stmt_fetch() 页面上的示例。 。我尝试设置光标但无济于事。是否mysql_stmt_store_result仅影响结果在客户端上缓冲,但它依赖于mysql_stmt_fetch,因此一次只检索一条记录?该文档暗示它检索“完整结果集”,(请参阅 the mysql page, first paragraph )您能否建议我应该做什么才能在一次调用中正确获取客户端缓冲的完整结果集?我是否误解了文档——完整结果集一次只有一条记录? TIA

最佳答案

函数mysql_stmt_store_result()在内部存储整个结果。如果您打算使用 mysql_stmt_row_seek() 或 mysql_stmt_row_tell() 等函数,则这是必需的。另外,在获取所有行之前,mysql 库无法得知结果集中的行数。如果存储结果,则可以在实际获取任何行之前获取结果集中的行数。

为什么?对于具有较大结果集的语句,执行该语句不一定会检索所有行。考虑通过网络连接查询数据库。如果您要通过第一次提取获得整个结果集,则第一次提取(或查询本身)可能需要很长时间来处理大型结果集,而连续提取会很快。由于在大多数情况下,第一次获取时不需要所有数据,因此 mysql 将只请求前几行。如果您实际上使用 mysql_stmt_fetch() 读取它们,mysql 库将请求更多行,直到没有更多行可供获取。

调用 mysql_stmt_store_result() 将一次获取所有行。

优点:

  • 可以任意定位行光标
  • 可以提前获取总行数

缺点:

  • 您无法提前知道需要多少内存来存储完整的结果集
  • 您无法提前知道需要多长时间才能检索完整的结果集

关于mysql - mysql_stmt_store_result 一次只返回一条记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27803348/

相关文章:

c - 二进制 == 在 'int' 和 'struct member' 之间,当两个值都是 int 时

c - 逐字读取没有结尾字符的文件

mysql - 查询中列的顺序重要吗?

mysql - innobackupex 将什么放入其标准输出中?

使用 void* 类型的参数调用 void* 类型的函数

objective-c - 使用 native objective-c 方法进行 C 回调

php - 循环查询并获得位置数组

mysql - 如何从 1 列中获取 2 个值

mysql - if - else 在一个查询中的多次更新中

c - 如何将字符数组 "char *buff[]"写入 c 中的文件