我正在尝试为SQLite的C API实现C ++ 11包装器,特别是对sqlite3_bind函数。我希望它是这种形式的东西(例如我的代码):
sqlt3::exec<void>(
_db,
"INSERT OR REPLACE INTO window VALUES('position', ?3, ?4);\n"
"INSERT OR REPLACE INTO window VALUES('size', ?1, ?2);\n"
"INSERT OR REPLACE INTO window VALUES('maximized', ?5, '0');\n",
size.x,
size.y,
position.x,
position.y,
static_cast<int>(IsMaximized())
);
这里的问题是?
在不同的语句之间共享。 exec
函数在内部逐个准备后续的SQL语句。所以我无法确定哪些参数应绑定到哪些语句,因为没有API来获取语句包含的语句槽。我可以获得时隙n
的计数(来自所有?NNN的最大NNN),但是我无法确定从零到n
的特定时隙是否实际被占用。这是因为对于无名参数和缺少参数,可以有单个?
没有数字而sqlite3_bind_parameter_name
返回NULL
。理想情况下,我希望有一些函数返回给定语句中使用的绑定点索引列表,或者至少某种方式来区分给定索引是否已关联“无名”&#39;绑定点或根本没有绑定点。
我遇到的一个解决方案是将所有参数按照它们传递给exec
的顺序绑定到所有语句,但我在文档中找不到它是否合法绑定到不存在的参数。另一个缺点是复杂性为v
次s
,其中v
是要绑定的变量数,s
是语句数。
所以,我提出了另一种解决方法,只需解析传递给exec
的整个字符串,并收集有关绑定点的信息(?
,?NNN
,:VVV
等。但是,我认为这不是一项相当简单的任务,因为这种特殊符号在字符串和quatations等某些上下文中并不特殊。那么,SQL语句中的另一个上下文是什么,其中特殊标记?
,?NNN
等不具有绑定点的含义?
一些解释:
&#34;尝试解析SQL毫无意义。&#34;
我不想解析SQL,只检测参数的存在和索引(绑定点)。
&#34;你真的认为v * s会变得足够重要吗?&#34;
通常情况下没有,但我仍然不知道将参数绑定到未在语句中发生的插槽是否合法。并且?
存在问题,如果它出现在第二句的开头,它不应该有索引1,而应该将前一句中最后一个绑定点的索引增加1。
&#34;为什么你想在一个函数调用中允许多个语句?&#34;
我发现能够做到这一点非常方便,特别是当你需要在一次交易中执行它们时。