我正在研究C ++ API的开发,该API使用自定义设计的插件使用其API和特定的SQL语法与不同的数据库引擎接口。

目前,我正在尝试找到一种插入 BLOB 的方法,但是由于 NULL 是c/c ++中的终止字符 插入 请求参数。到目前为止,我已经合作过

//...
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)。

预先感谢您的反馈。

有帮助吗?

解决方案

您需要将此函数与准备好的语句一起使用。

int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));

在 C/C++ 中,处理字符串中 NULL 的标准方法是存储字符串的开头和长度,或者存储指向字符串开头的指针和指向字符串结尾的指针。

其他提示

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

正如前三张海报所建议的,我确实使用了准备好的语句 - 另外因为我也对获取列的数据类型和一个简单的 sqlite3_get_table() 不行。

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

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

它仍然是 捆绑 的相应值。这是通过发布尽可能多的 sqlite3_bind_blob() 调用作为列。(我也求助于 sqlite3_bind_text() 对于其他“简单”数据类型,因为我正在开发的 API 可以将整数/双精度数/等转换为字符串)。所以:

void* blobvalue[4];
int blobsize[4];
char *tail, *sql="INSERT INTO table VALUES(?,?,?,?)";
sqlite3_stmt *stmt=0;
sqlite3 *db;
/* ... */
db=sqlite3_open("sqlite.db");
sqlite3_prepare_v2(db, 
                   sql, strlen(sql)+1, 
                   &stmt, &tail);
for(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_prepare_v2(), ,然后使用绑定 blob sqlite3_bind_blob(). 。请注意,您绑定的语句将是 插入表值(?).

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top