如何使用sqlite_bind_text将文本绑定到 SQLite 预准备语句



如果运行以下使用该sqlite3_prepare_v2的 SQL,它将生成预期的结果。

select id, path, name
from media
where id in (
select media_id
from media_tags
where tag_id in (
select id 
from tags
where name in ( 'name_1', 'name_2', 'name_5', 'name_8', 'name_43' ) )
group by media_id
having count( media_id ) = 5 );

但如果改为

select id, path, name
from media
where id in (
select media_id
from media_tags
where tag_id in (
select id 
from tags
where name in ( ? ) )
group by media_id
having count( media_id ) = ? );

sqlite3_bind_text( stmt, 1, char_ptr, -1, SQLITE_STATIC )并且采用sqlite3_bind_int( stmt, 2, 5 ),则不返回任何结果,也没有错误。

如果in子句名称是硬编码的,并且仅使用sqlite3_bind_int设置了 media_id 计数 5,则返回预期结果。

对 5 进行硬编码并尝试将名称与sqlite3_bind_text绑定不会返回结果。

在所有情况下,语句都已成功准备,至少在该步骤中不会生成错误代码。

如果char_ptr打印到屏幕上,则'name_1', 'name_2', 'name_5', 'name_8', 'name_43'.

我一定误解了一些简单的事情。你能告诉我我错过了什么吗?

谢谢。


我也在SQLite论坛上发布了这个问题,并收到了关于可能是一个相对较新的功能的回复,该功能将允许in集中的一个?,这似乎表明即使在集合中可变数量的元素也可以准备准备好的语句。它被称为carray array extension function。我还没有尝试过,但我想我最好现在链接它,以防我以后忘记。

尝试使用 ? 每个绑定变量,如下所示:

where name in (?, ?, ?, ?, ?)

然后为每个呼叫sqlite3_bind_text。

最新更新