2014-05-14 2 views
0

나는 다음과 같은 기능을 사용하여 내 C 프로그램에 SQLite는 데이터베이스 내부의 이름 열을 업데이트하기 위해 노력하고있어 :SQLite3 오류 : ''가까이 '': 구문 오류 '?

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

가 calloc''의 첫 번째 매개 변수는 sizeof (wchar_t를)'해야한다; 당신은 같은 형식의 문제를 방지하기 위해 매개 변수를 사용한다 그리고 당신은 제로 터미네이터를 잊어 버렸습니다. –

+0

sizeof (wchar_t *)는 정확하지만 실수는 제로 종결자를 잊어 버린 것입니다. – user3457200

+0

'wchar_t *'는 포인터이지만 문자 배열을 할당하려고합니다. –

답변

1

sqlite3_prepare16의 세 번째 매개 변수는 문 길이 (바이트) 여야합니다.

그러나 sizeof(update)update 변수의 크기이며 포인터는 2 자와 같은 크기입니다.

실제 길이 (이미 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); 
} 
+0

정말 내 문제를 해결! 고마워. – user3457200