mysql_stmt_store_result return 一次只有一条记录吗

Does mysql_stmt_store_result return only one record at a time

Win7下的MySQl 5.6,CAPI预处理语句。第一次使用mysql_stmt_store_result().

我准备了一个缓冲区来容纳 40 条记录(例如,struct TICK ticks[40])。在绑定数组中,我设置了缓冲区中第一个结构的元素地址(例如 bind.buffer = (char*)&ticks[0].elem1; 等)。在 bind.buffer_length 中,我为结构的所有元素放入缓冲区中可用的 space,例如 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. I tried setting up a cursor to no avail. Is it so that mysql_stmt_store_result only effects that the result is buffered on the client, but that it relies on mysql_stmt_fetch and so retrieves but one record at a time? The documentation implies it retrieves a "complete result set", (see 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() 的调用将一次获取所有行。

优点:

  • 你可以任意定位行光标
  • 可以提前得到总行数

缺点:

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