sqlite3绑定变量语法

时间:2015-03-28 21:15:17

标签: c++ c++11 sqlite parameter-passing

我正在尝试为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的顺序绑定到所有语句,但我在文档中找不到它是否合法绑定到不存在的参数。另一个缺点是复杂性为vs,其中v是要绑定的变量数,s是语句数。

所以,我提出了另一种解决方法,只需解析传递给exec的整个字符串,并收集有关绑定点的信息(??NNN:VVV等。但是,我认为这不是一项相当简单的任务,因为这种特殊符号在字符串和quatations等某些上下文中并不特殊。那么,SQL语句中的另一个上下文是什么,其中特殊标记??NNN等不具有绑定点的含义?

一些解释:

&#34;尝试解析SQL毫无意义。&#34;

我不想解析SQL,只检测参数的存在和索引(绑定点)。

&#34;你真的认为v * s会变得足够重要吗?&#34;

通常情况下没有,但我仍然不知道将参数绑定到未在语句中发生的插槽是否合法。并且?存在问题,如果它出现在第二句的开头,它不应该有索引1,而应该将前一句中最后一个绑定点的索引增加1。

&#34;为什么你想在一个函数调用中允许多个语句?&#34;

我发现能够做到这一点非常方便,特别是当你需要在一次交易中执行它们时。

0 个答案:

没有答案