SQLite3 : Insert BLOB with NULL characters in C++

标签 sqlite null escaping blob

我正在开发使用定制设计插件的 C++ API 使用它们的 API 和特定的 SQL 与不同的数据库引擎交互 语法。

目前,我正试图找到一种插入 BLOB 的方法,但是由于 NULL 是 C/C++ 中的终止字符,BLOB 在构造时被截断 INSERT INTO 查询字符串。到目前为止,我已经与

//...
char* sql;
void* blob;
int len;
//...
blob = some_blob_already_in_memory;
len = length_of_blob_already_known;
sql = sqlite3_malloc(2*len+1);
sql = sqlite3_mprintf("INSERT INTO table VALUES (%Q)", (char*)blob);
//...

我希望,如果完全可以在 SQLite3 交互式控制台中执行此操作,则应该可以使用正确转义的 NULL 字符构造查询字符串。也许有一种方法可以使用 SQLite SQL 语法也支持的标准 SQL 来做到这一点?

肯定有人以前遇到过同样的情况。我用谷歌搜索并找到了一些答案,但使用的是其他编程语言 (Python)。

提前感谢您的反馈。

最佳答案

再次感谢大家的反馈。这次我要报告我是如何借助此处提供的指示解决问题的。希望这会在将来帮助其他人。

正如前三位发帖者所建议的那样,我确实使用了准备好的语句——此外,因为我也对获取列的数据类型感兴趣,而简单的 sqlite3_get_table() 是行不通的。

准备好如下常量字符串形式的SQL语句后:

INSERT INTO table VALUES(?,?,?,?);

它仍然是相应值的绑定(bind)。这是通过发出与列一样多的 sqlite3_bind_blob() 调用来完成的。 (对于其他“简单”数据类型,我还使用了 sqlite3_bind_text(),因为我正在处理的 API 可以将整数/ double /等转换为字符串)。所以:

#include <stdio.h>
#include <string.h>
#include <sqlite3.h>
/* ... */
void* blobvalue[4] = { NULL, NULL, NULL, NULL };
int blobsize[4] = { 0, 0, 0, 0 };
const char* tail = NULL;
const char* sql = "INSERT INTO tabl VALUES(?,?,?,?)";
sqlite3_stmt* stmt = NULL;
sqlite3* db = NULL;
/* ... */
sqlite3_open("sqlite.db", &db);
sqlite3_prepare_v2(db,
                   sql, strlen(sql) + 1,
                   &stmt, &tail);
for(unsigned int i = 0; i < 4; i++) {
    sqlite3_bind_blob(stmt, 
                      i + 1, blobvalue[i], blobsize[i], 
                      SQLITE_TRANSIENT);
}
if(sqlite3_step(stmt) != SQLITE_DONE) {
    printf("Error message: %s\n", sqlite3_errmsg(db));
}
sqlite3_finalize(stmt);
sqlite3_close(db);

另请注意,某些函数(sqlite3_open_v2()sqlite3_prepare_v2())出现在更高版本的 SQLite 中(我想是 3.5.x 及更高版本)。

sqlite.db 文件中的 SQLite 表 tabl 可以用(例如)创建

CREATE TABLE tabl(a TEXT PRIMARY KEY, b TEXT, c TEXT, d TEXT);

关于SQLite3 : Insert BLOB with NULL characters in C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/404879/

相关文章:

MySQL根据另一列的值联接一列中显示 '0'的两个表

objective-c - "sending a message to nil"是什么意思,为什么是特例?

sql - 如何在查询中使用 FOR XML PATH ('' )而不转义特殊字符?

c# - 对 Sqlite C# ORM 代码生成的任何建议

java - 在Java中使用SQLite实现登录系统有很大困难

bash - SQLite,bash脚本和串联运算符

javascript - 将 HTML 作为 JSON 传递的最佳实践

android sqlite 查询慢

c - 通过空结构指针取消引用变量地址,无段错误

regex - sed 删除文本的不同部分