C++ 如何调试SQLite3中的绑定参数?
在中,我学习了如何正确地将参数绑定到准备好的SQL语句。但是,我发现,如果不绑定所有参数,sqlite3_step()将返回SQLITE_DONE。我宁愿认为这是一个错误。此外,我不知道这是否是我代码中的错误源,因此我的问题旨在了解如何在绑定过程中调试SQLite的行为: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(如果未设置所有参数)
如果在查询之前添加“解释”,则会输出查询计划。 就你而言:
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谢谢!