我正在使用C API到SQLite,修改数据库的唯一方法似乎是将SQL语句作为字符串。例如,文档显示了一个代码示例,它只是通过exec
函数调用将命令行字符串传递给引擎:
rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
我不想构建字符串并将它们传递给翻译人员,不仅仅是因为安全问题,还因为我不想在一起纠缠字符串和转义序列。
是否有SQLite函数允许我直接操作数据库而不创建SQL字符串?
答案 0 :(得分:1)
sqlite_exec
仅支持单个SQL字符串。
如果你真的想要使用它,你可以安全地将字符串和转义序列与sqlite3_mprintf拼凑在一起。
为避免将cobbling字符串和转义序列放在一起,请使用预处理语句和参数绑定:
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);
}
答案 1 :(得分:0)
SQLite专门设计为SQL数据库,这意味着您使用SQL作为语言与数据库交互并让数据库关注任何内部,优化等.SQL被定义为独立于较低级别的语言实现而不是实现的API。
但也许您的要求根本不需要SQL数据库。在这种情况下,有几个更简单的数据库(如BerkeleyDB),它只为一个键存储一个值,并且具有多种编程语言的API。