SQLite3错误:'近" UP" :语法错误'?

时间:2014-05-14 14:28:43

标签: c sqlite

我尝试使用以下函数在我的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

我该如何解决这个问题?

1 个答案:

答案 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);
}