C++sqlite3绑定参数
C++ sqlite3 bind parameters
我只玩了几天C++的sqlite3库,但这让我很沮丧。
我想定义一个参数化的CREATE TABLE,然后将参数绑定到它
const char[] CREATE_SQL =
"CRAETE TABLE t1 ("
" name VARCHAR(:NAME_LEN)"
" other VARCHAR(:OTHER_LEN)"
");";
这个想法是,在一个不同的文件(.cpp到这个头文件)中,我可以将这些参数绑定到:
int index = sqlite3_bind_parameter_index(stmt, ":NAME_LEN");
sqlite3_bind_int(stmt, index, _DB_FIELD_SIZE_NAME);
其中_DB_FIELD_SIZE_NAME也在其他地方定义。
我不想将sprintf()
与包含%d
而不是:NAME_LEN
和:OTHER_LEN
的CREATE_SQL
一起使用,因为我可能会更改参数的顺序或添加新的参数,并且我希望保持绑定的显式。
现在,针对问题:我的prepare不返回SQLITE_OK
,但会导致sqlite3_stmt
的空指针。这是我的:
sqlite3_stmt *stmt;
const char *pStmt = 0;
if( SQLITE_OK != sqlite3_prepare_v2(*db, CREATE_SQL, -1, &stmt, &pStmt) )
// throws exception with the sqlite3_errmsg(*db) text
所以,我得到的错误是:
near ":NAME_LEN": syntax error
我做错了什么?我确信数据库连接打开正常。
为了不回答您的问题,sqlite没有严格的文本列大小。为了兼容性,它接受VARCHAR类型,但其行为没有变化。
你最终总会得到类似这样的东西:
const char *sql =
"CREATE TABLE t1 ("
" name TEXT"
" ,other TEXT"
");";
为了回答你的问题,我认为你不被允许这样做。Sqlite的替换机制只适用于通常被视为值参数的参数。
例如,您通常在INSERT
或UPDATE
语句中看到的内容。
const char *sql = "INSERT INTO foo (a,b) VALUES (?1,?);";
我不记得您是否可以在CREATE
语句中执行这些操作,也许对于默认参数?已经很久了。
我发现boost::format
在您必须更改非值参数时,比我尝试过的任何其他解决方案都不太可能破坏和创建更清晰的代码。
#include <boost/format.hpp>
// ...
int instance_id = 42;
const char *sql = "CREATE TABLE type_%1% (a,b);";
boost::str( boost::format(sql) % instance_id );
我绝对鼓励您避免进行无值参数替换,除非您绝对必须这样做。这是一个维护麻烦和容易出错的问题。
相关文章:
- 为什么 std::绑定错误参数可以成功?
- C++初始化 std::function 时如何将占位符绑定到引用/引用参数?
- 绑定到可变参数成员函数
- 如何在 C# 中将带有参数的函数绑定到包中
- 如何将参数绑定到构造函数?
- C++ 如何将参数绑定到具有相同返回类型的函数,并将它们全部存储在一个容器中
- 函数参数绑定通过参考与传递指针传递数组的规则
- C 如何将参数绑定到接受函数的函数
- 模板参数绑定
- 是由BOOST ::返回的函子,仅使用绑定的参数绑定,等效于不采用参数的函数
- 当常量引用参数绑定到右值时,右值是否保持其"status"?
- 用emscripten中的参考参数绑定函数
- 如何将Boost ::函数对象与所有参数绑定
- std ::将参数绑定到没有对象的情况下的成员函数
- 隐马尔可夫模型-在C++中实现参数绑定
- 函数参数绑定的完美转发和歧义
- 为容器中的每个对象调用具有一个参数(绑定)的成员函数
- std::bind():将lambda与右值引用作为参数绑定
- 与派生函数参数绑定
- 与模板模板类一起使用的自定义模板参数绑定器