Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ sqlite3绑定变量语法_C++_C++11_Sqlite_Parameter Passing - Fatal编程技术网

C++ sqlite3绑定变量语法

C++ sqlite3绑定变量语法,c++,c++11,sqlite,parameter-passing,C++,C++11,Sqlite,Parameter Passing,我试图实现SQLite的C++11封装到C API,特别是sqlite3_绑定函数。我希望它的形状与我的代码中的示例相同: 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 INT

我试图实现SQLite的C++11封装到C API,特别是sqlite3_绑定函数。我希望它的形状与我的代码中的示例相同:

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来获取该语句包含的语句槽。我可以从all?NNN中获得插槽数n a max NNN,但我无法确定从0到n的特定插槽是否实际被占用。是因为可以有单身吗?如果没有数字和sqlite3,则绑定参数\u name将为无名参数和缺少参数返回NULL。理想情况下,我希望有一些函数返回给定语句中使用的绑定点的索引列表,或者至少以某种方式区分给定索引是否具有关联的“无名”绑定点或根本没有绑定点

我想到的一个解决方案是将所有参数按传递给exec的顺序绑定到所有语句,但我在文档中没有发现绑定到不存在的参数是否合法。另一个缺点是复杂性是v乘以s,其中v是要绑定的变量数,s是语句数

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

一些解释:


试图解析SQL是毫无意义的

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

你真的认为v*s会变得足够大以至于它很重要吗

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

为什么要在一个函数调用中允许多个语句


我发现这样做非常方便,尤其是当您需要在一个事务中执行它们时。

尝试解析SQL是毫无意义的。你真的认为v*s会变得足够大以至于它很重要吗?为什么要在一个函数调用中允许多个语句?那么它将如何区分SQL语句和字符串参数呢?@CL我已经在主要帖子中为您的问题添加了答案。你能澄清最后一个问题吗,因为我不明白?execINSERT INTO t VALUES,INSERT INTO t VALUES:这是一个语句和一个参数吗?@CL注意,在我的示例中,特定语句后没有逗号。带有SQL语句的字符串始终作为第二个参数整体传递。在上面的例子中,第二个参数是一个参数。