【问题标题】:Is there a way to undo SQLite3 step call in C/C++?有没有办法在 C/C++ 中撤消 SQLite3 步骤调用?
【发布时间】:2019-03-29 05:09:18
【问题描述】:

我正在使用的系统使用 SQLite3 数据库作为后台日志存储,每个条目作为两列条目:|时间|数据|。重放日志就像准备一条语句来获取所有条目一样简单,每个sqlite3_step()调用都会及时返回数据。

从那时起,我们就尝试使用专门的工具来根据需要推进和跳过。现在,我们发现自己处于需要向后退一个或多个条目的情况。有没有办法不重置和/或生成新查询来撤消sqlite3_step() 发生的入口推进?

sqlite3_reset() 不是一个合适的解决方案,因为这会将数据库指针返回到数据库中的第一个条目。我希望回到上次 sqlite3_step() 通话的前一个条目。

【问题讨论】:

  • sqlite step back的可能重复
  • 保存您在所选数据结构中已经看到的行中的数据,并使用它来查看以前的记录。
  • 对于其中的一些,我们讨论的是 GB 到 TB 的数据量级;我们不想预读,因为使用这些数据的一些工具的整体速度下降和资源占用。关于“sqlite 后退”重复:sqlite_reset() 不是一个选项,因为它会将您带回到数据库中的第一个条目。我正在寻找前一个检索到的条目。

标签: c++ c sqlite


【解决方案1】:

有没有办法不重置和/或生成新查询来撤消sqlite3_step() 发生的进入推进?

没有,从当前版本 (3.27.2) 开始,没有。 SQLite3 仅提供只进结果集。

您似乎已经意识到通过sqlite3_reset() 重置准备好的语句的可能性,但我认为您理解这与后退不是一回事,即使结合再次通过结果前进,相反到speculation presented in answer to a similar question。重置会放弃当前的结果集,随后再次单步执行准备好的语句会导致执行新的查询,并检索 那些结果。

如果您希望能够在跳过前一个结果行之后访问数据而不执行新查询,那么您需要在某种本地数据结构中捕获并保留它。根据您的需要,这可能不必是所有您已阅读的数据。另一方面,如果您有其他原因而不是重新读取数据以希望结果集光标向后移动,那么您需要找到另一种方法来实现应该服务的任何目的。

【讨论】:

  • 谢谢你。是的,我确实阅读了最新的文档,当我找不到它时,我推测它是不可能的,或者我不知何故错过了它。最初,我希望避免捕获以前读取的数据。这种方法产生了一些错误案例(在我们的应用程序中,而不是 SQLite3 本身)。但考虑到当前的要求,这似乎是不可避免的。感谢您的洞察力!
猜你喜欢
  • 2019-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-01
  • 1970-01-01
相关资源
最近更新 更多