在other question中,我学会了如何将参数正确绑定到准备好的SQL语句。但是,如果我没有绑定所有参数,我发现sqlite3_step()返回SQLITE_DONE。我宁愿认为这是一个错误。此外,我不知道这是否是我的代码中的错误来源,因此我的问题旨在了解如何在绑定过程中调试SQLite的行为:
答案 0 :(得分:2)
您未使用sqlite3_bind_*()
显式设置的任何参数都具有默认值NULL。
这意味着始终设置所有参数。
没有自行读取参数值的功能(假设您知道这些值,因为您自己设置了它们。)
您可以使用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复制了绑定的内容。