如何使用SQLite_bind_text将文本适当地绑定到SQLite准备的语句
如果使用如何使用SQLite_bind_text将文本适当地绑定到SQLite准备的语句,sql,sqlite,Sql,Sqlite,如果使用sqlite3\u prepare\u 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',
sqlite3\u prepare\u 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\u bind\u text(stmt,1,char\u ptr,-1,SQLITE\u STATIC)
使用了sqlite3\u bind\u int(stmt,2,5)
,没有返回结果,也没有错误
如果子句名称中的是硬编码的,并且只有媒体id计数5设置为sqlite3\u bind\u int
,则返回预期结果
硬编码5并尝试使用sqlite3\u bind\u text
绑定名称不会返回结果
在所有情况下,语句都已成功准备,至少在该步骤中不会生成错误代码
如果字符ptr打印到屏幕上,则它是“名称1”、“名称2”、“名称5”、“名称8”、“名称43”
我一定是误解了一些简单的事情。你能告诉我遗漏了什么吗
多谢各位
我也在SQLite论坛上发布了这个问题,并收到了一个关于什么可能是一个相对新的特性的回复,该特性允许在中的?
集合中使用一个,这似乎表明,即使集合中的元素数量可变,也可以在编译时准备好准备好的语句。它被称为carray数组扩展函数
。我还没有试过,但我想最好现在就试一下,以防以后忘记。试着用一个?每个绑定变量,如中所示:
where name in (?, ?, ?, ?, ?)
然后分别调用sqlite3\u bind\u text。哦,我一点也没想到,谢谢。我会尝试一下。有时您会在运行时生成sql查询本身和匹配的bind语句。谢谢。这似乎奏效了。所需标签的数量和名称会有所不同;因此,存储准备好的语句似乎没有什么好处,因为每次请求时都必须重新准备。也可以只在SQL查询文本本身中包含名称和数字,而不使用问号和绑定语句。在SQLite论坛上的一篇帖子中,回复描述了Carray
方法,该方法可以接受中的中的单个?
。我在原来问题的末尾加了一句。我还没有试过,但我认为它需要从本月3.34开始的最新版本的SQLite。