mysql_stmt_store_result一次只返回一条记录

时间:2015-01-06 16:51:55

标签: mysql c

MySQl 5.6在Win7,C API准备语句下。第一次使用 mysql_stmt_store_result()

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

我调用 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

1 个答案:

答案 0 :(得分:1)

函数mysql_stmt_store_result()在内部存储整个结果。如果您打算使用mysql_stmt_row_seek()mysql_stmt_row_tell()等功能,则必须执行此操作。此外,mysql lib在获取所有行之前无法分辨结果集中的行数。如果存储结果,则可以在实际获取任何行之前获取结果集中的行数。

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

mysql_stmt_store_result()的调用将立即获取所有行。

优点:

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

缺点:

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