C++ 如何调试SQLite3中的绑定参数?

C++ 如何调试SQLite3中的绑定参数?,c++,sqlite,C++,Sqlite,在中,我学习了如何正确地将参数绑定到准备好的SQL语句。但是,我发现,如果不绑定所有参数,sqlite3_step()将返回SQLITE_DONE。我宁愿认为这是一个错误。此外,我不知道这是否是我代码中的错误源,因此我的问题旨在了解如何在绑定过程中调试SQLite的行为: 如何确定哪些参数未设置 出于调试目的,我是否可以看到插入了绑定参数的语句 为什么SQLite不响应SQLite\u not\u ALL\u PARAMETERS\u SET或SQLite\u ERROR(如果未设置所有参数)

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

  • 如何确定哪些参数未设置
  • 出于调试目的,我是否可以看到插入了绑定参数的语句
  • 为什么SQLite不响应SQLite\u not\u ALL\u PARAMETERS\u SET或SQLite\u ERROR(如果未设置所有参数)

  • 如果在查询之前添加“解释”,则会输出查询计划。 就你而言:

    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
    
    使用as reference告诉我们,它检查var?2是否为int,如果不是,则跳转到指令9:Close,然后是halt

    ps:我使用SQLite数据库浏览器来捕获您的执行计划,
    下一步(对您来说)是确定您是否可以查询?2应该是int,或者它应该如何处理失败情况。

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

  • 未使用
    sqlite3\u bind_*()
    显式设置的任何参数的默认值为NULL

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

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


  • 关于第2点,请查看sqlite3\u expanded\u sql@DaveElton谢谢!