在不使用SQL的情况下以编程方式修改SQLite数据库
我正在将C API用于SQLite,修改DB的唯一方法似乎是使用SQL语句作为字符串。例如,文档显示了一个代码示例,该示例仅通过在不使用SQL的情况下以编程方式修改SQLite数据库,sql,c,sqlite,Sql,C,Sqlite,我正在将C API用于SQLite,修改DB的唯一方法似乎是使用SQL语句作为字符串。例如,文档显示了一个代码示例,该示例仅通过exec函数调用将命令行字符串传递给引擎: rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg); 我不想构造字符串并将它们传递给解释器,这不仅仅是因为安全问题,也是因为我不想胡乱拼凑字符串和转义序列 是否有SQLite函数允许我在不生成SQL字符串的情况下直接操作数据库?SQLite是专门设计为SQL数据
exec
函数调用将命令行字符串传递给引擎:
rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
我不想构造字符串并将它们传递给解释器,这不仅仅是因为安全问题,也是因为我不想胡乱拼凑字符串和转义序列
是否有SQLite函数允许我在不生成SQL字符串的情况下直接操作数据库?SQLite是专门设计为SQL数据库的,这意味着您使用SQL作为与数据库交互的语言,让数据库关心任何内部,优化等。SQL被定义为独立于较低级别实现的语言,而不是实现的API
但是,您的需求可能根本不需要SQL数据库。在这种情况下,有几个更简单的数据库(如BerkeleyDB),它们只存储一个键的值,并且具有用于多种编程语言的API。
sqlite\u exec
只支持一个SQL字符串。
如果您真的想使用它,您可以安全地将字符串和转义序列与一起使用
为了避免混淆字符串和转义序列,请使用准备好的语句和参数绑定:
sqlite3_stmt *stmt;
const char *sql = "UPDATE MyTable SET Name = ? WHERE ID = ?";
rc = sqlite3_prepare_v2(db, sql, -1, &stmt, NULL);
if (rc == SQLITE_OK) {
sqlite3_bind_text(stmt, 1, "Tyler Durden", -1, SQLITE_TRANSIENT);
sqlite3_bind_int (stmt, 2, 1655700);
rc = sqlite3_step(stmt);
if (rc != SQLITE_DONE)
; // error
sqlite3_finalize(stmt);
}
您总是需要创建一个字符串来描述操作,但是您可以使用“编译”语句(如果使用得当)来消除任何“SQL注入”的机会,并方便指定变量PARM。好吧,不要“胡乱拼凑字符串和转义序列”,这就是占位符/准备语句的用途。问题已解决。可能有一种方法可以创建/调用SQLite使用的内部“程序/DSL”,但这只是出于研究/学习/娱乐目的,而不是为了避免这个“问题”;描述这些操作是不切实际的。另一种方法可能更实际:使用DSL/树到SQL(带有占位符/绑定)库/转换。我不确定C有什么,但在其他语言中有很多例子,我创建了类似的高级SQL生成器。