我尝试使用以下函数在我的C程序上更新sqlite数据库中的名称列:
void update_name(int row, wchar_t* name, int maxnamelen){
const wchar_t* update_tempate = L"UPDATE mytable SET name='%s' WHERE(id=%d);";
wchar_t* update = calloc(sizeof(wchar_t*), maxnamelen+wcslen(update_template));
swprintf(update, update_template, name, row);
sqlite3_stmt *stmt;
sqlite3_prepare16(sqdb, update, sizeof(update), &stmt, 0);
sqlite3_step(stmt);
sqlite3_finalize(stmt);
}
但遗憾的是我没有更新该行,因为我收到错误near "UP" : syntax error
。
我该如何解决这个问题?
答案 0 :(得分:1)
sqlite3_prepare16
的第三个参数必须是语句的长度,以字节为单位。
但是,sizeof(update)
是update
变量的大小,它只是一个指针,它的大小恰好与两个字符相同。
您必须提供实际长度(已由swprintf
计算),或仅为-1。
请注意,当名称包含引号时,这仍然会爆炸。 您应该使用参数来避免此类格式问题:
void update_name(int row, wchar_t* name)
{
const wchar_t* update = L"UPDATE mytable SET name=? WHERE id=?";
sqlite3_stmt *stmt;
// error handling is missing
sqlite3_prepare16(sqdb, update, -1, &stmt, 0);
sqlite3_bind_text16(stmt, 1, name, -1, SQLITE_STATIC);
sqlite3_bind_int(stmt, 2, row);
sqlite3_step(stmt);
sqlite3_finalize(stmt);
}