如何在SQLite3中调试绑定参数?

时间:2015-08-04 12:41:14

标签: c++ sqlite

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

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

3 个答案:

答案 0 :(得分:2)

  1. 您未使用sqlite3_bind_*()显式设置的任何参数都具有默认值NULL。

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

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

答案 1 :(得分:1)

如果你添加一个'解释'在查询之前,它会输出查询计划。 在你的情况下:

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:Close,然后停止。

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

答案 2 :(得分:0)

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