sqlite3绑定多个语句值

sqlite3 bind multiple statement values

本文关键字:语句 绑定 sqlite3      更新时间:2023-10-16

考虑:

int user_id = 0x01; //dummy
int size_id = 0x01; //dummy
sqlite3_stmt *stmt;
sqlite3 *db;
int rc = sqlite3_open("path_to_database.db", &db);
if( rc != SQLITE_OK ) 
{
fprintf(stderr, "Can't open database: %sn", sqlite3_errmsg(db));
return -1;
} 
rc = sqlite3_prepare_v2(db, "SELECT id, type, time_registered"
" from myTestTable"
" where user = ? and size = ?", -1, &stmt, NULL);
if (rc != SQLITE_OK)
{
throw std::string(sqlite3_errmsg(db));
sqlite3_finalize(stmt);
return -1;
}
rc = sqlite3_bind_int(stmt, 1, user_id);
if (rc != SQLITE_OK)
{
std::string errmsg(sqlite3_errmsg(db));
sqlite3_finalize(stmt);
throw errmsg;
return -1;
}
rc = sqlite3_bind_int(stmt, 2, size_id);
if (rc != SQLITE_OK)
{
std::string errmsg(sqlite3_errmsg(db));
sqlite3_finalize(stmt);
throw errmsg;
return -1;
}
[...]

这确实有效,但似乎对用户不友好。我可以使用snprintf来准备语句,而不是绑定,但我会失去安全性(即使我不应该在本地数据库上面临注入攻击(。

有没有更好的方法可以使用sqlite3_bind_TYPES在语句中绑定多个具有相同类型的值(如果可能的话,也可以不绑定(?

您可以使用类似SQLiteCpp的c++包装器。如果你不喜欢这个,github页面底部会有一个列表。

如果您更喜欢使用c接口,则可以反转绑定语句的逻辑。这样至少可以稍微整理一下代码。

int rc = sqlite3_open("path_to_database.db", &db);
if( rc != SQLITE_OK ) 
{
fprintf(stderr, "Can't open database: %sn", sqlite3_errmsg(db));
return -1;
} 
rc = sqlite3_prepare_v2(db, "SELECT id, type, time_registered"
" from myTestTable"
" where user = ? and size = ?", -1, &stmt, NULL);
if (rc == SQLITE_OK)
rc = sqlite3_bind_int(stmt, 1, user_id);
if (rc == SQLITE_OK)
rc = sqlite3_bind_int(stmt, 2, size_id);
if (rc != SQLITE_OK)
{
throw std::string(sqlite3_errmsg(db));
sqlite3_finalize(stmt);
return -1;
}
[...]

Mike