再次感谢大家的反馈。这一次,我报告了我是如何借助此处提供的指示解决问题的。希望这将在未来对其他人有所帮助。
正如前三张海报所建议的,我确实使用了准备好的语句——另外因为我也对获取列的数据类型感兴趣,而简单的sqlite3_get_table()
不会这样做。
准备好以下常量字符串形式的 SQL 语句后:
INSERT INTO table VALUES(?,?,?,?);
它仍然是相应值的绑定。这是通过发出sqlite3_bind_blob()
与列一样多的调用来完成的。(我还求助于sqlite3_bind_text()
其他“简单”数据类型,因为我正在处理的 API 可以将整数/双精度/等转换为字符串)。所以:
#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 及更高版本)。
可以使用(例如)创建tabl
文件中的 SQLite 表sqlite.db
CREATE TABLE tabl(a TEXT PRIMARY KEY, b TEXT, c TEXT, d TEXT);