【问题标题】:How to debug binding parameters in SQLite3?如何在 SQLite3 中调试绑定参数?
【发布时间】:2018-05-15 23:02:49
【问题描述】:

在other question 中,我学习了如何正确地将参数绑定到准备好的 SQL 语句。但是,我发现如果我不绑定所有参数,sqlite3_step() 会返回 SQLITE_DONE。我宁愿认为这是一个错误。此外,我不知道这是否是我代码中的错误来源,因此我的问题旨在了解如何在绑定过程中调试 SQLite 的行为:

  1. 如何确定哪些参数未设置?
  2. 我能否以某种方式查看插入了绑定参数的语句以进行调试?
  3. 如果没有设置所有参数,为什么 SQLite 不响应 SQLITE_NOT_ALL_PARAMETERS_SET 或 SQLITE_ERROR?

【问题讨论】:

    标签: c++ sqlite


    【解决方案1】:
    1. 您没有使用sqlite3_bind_*() 显式设置的任何参数都具有默认值NULL。

      这意味着始终设置所有参数。

    2. 没有自己读取参数值的功能(假设您知道这些值,因为您自己设置了它们)。
      您可以使用sqlite3_expanded_sql() 获取整个查询文本,包括参数值。

    【讨论】:

    【解决方案2】:

    如果您在查询前添加“解释”,它将输出查询计划。 在你的情况下:

    addr    opcode      p1  p2  p3      p4          p5
    0       Init        0   11  0                   00  NULL
    1       OpenRead    0   2   0       2           00  NULL
    2       Variable    2   1   0       ?2          00  NULL
    3       MustBeInt   1   9   0                   00  NULL
    4       NotExists   0   9   1                   00  NULL
    5       Column      0   1   2                   00  NULL
    6       Ne          3   9   2       (BINARY)    52  NULL
    7       Copy        1   4   0                   00  NULL
    8       ResultRow   4   1   0                   00  NULL
    9       Close       0   0   0                   00  NULL
    10      Halt        0   0   0                   00  NULL
    11      Transaction 0   0   7       0           01  NULL
    12      TableLock   0   2   0       Names       00  NULL
    13      Variable    1   3   0       ?1          00  NULL
    14      Goto        0   1   0                   00  NULL
    

    使用https://www.sqlite.org/opcode.html 作为参考,告诉我们它会检查您的 var ?2 是否为 int,如果不是,则跳转到指令 9:关闭,然后停止。

    ps:我使用 DB Browser for SQLite 来捕获您的执行计划, 下一步(对您而言)是找出您是否可以查询 ?2 应该是一个 int,或者它应该如何处理失败情况。

    【讨论】:

      【解决方案3】:

      如果绑定成功但 sqlite3_step() 没有成功,请检查您绑定的文本或 blob 是否尚未销毁。另一种方法是使用 SQLITE_TRANSIENT 作为 sqlite3_bind_text() 中的最后一个参数。 SQLITE_TRANSIENT 复制绑定的内容。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-26
        • 2011-10-12
        • 2017-08-02
        • 2010-12-30
        相关资源
        最近更新 更多