Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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
在不使用SQL的情况下以编程方式修改SQLite数据库_Sql_C_Sqlite - Fatal编程技术网

在不使用SQL的情况下以编程方式修改SQLite数据库

在不使用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数据

我正在将C API用于SQLite,修改DB的唯一方法似乎是使用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生成器。