2010-05-31 3 views
3

я должен вставить строку в базу данных SQLite моя команда ..Как вставить любую строку в sqlite3 в с

Err=sqlite_exec(DB, "create table tbl5(TEXT varchar(100));", xCallback, (void*)"First Test", &ErrMsg); 

Err=sqlite_exec(DB, "insert into tbl5 values ('some string');", xCallback, (void*)"First Test", &ErrMsg); 

работает нормально, но когда я хочу поставить s="some string" т.е.

Err=sqlite_exec(DB, "insert into tbl5 values (s);", xCallback, (void*)"First Test", &ErrMsg); 

то это не работает так, как добавить переменную, то он не работает так, как вставить переменную в SQLite базе данных поблагодарить у

ответ

6

Не использовать sprintf(), но sqlite3_mprintf(). Here - это документация.

char s[20] = "some string"; 
char* query = sqlite3_mprintf("insert into tbl5 values ('%q');", s); 

В противном случае у вас есть риск SQL injection.

Полученная строка запроса должна быть освобождена с использованием sqlite3_free().

Также обратите внимание на '%q' вместо обычного '%s'.

+0

Интересная функция, я не знал, что она существует. Я использовал sqlite3 в C++, используя функцию 'std' для построения моих запросов. Следовательно, я не знал об этой C-ориентированной функциональности. – Pieter

+0

@Pieter: На самом деле, я также использую его в 'C++'. Документация sqlite не очень проста, но кажется, что это единственный способ сделать это безопасно. – ereOn

0

Вы могли бы у se sprintf, чтобы создать форматированную строку.

char s[20] = "some string"; 
char query[100]; 
sprintf(query, "insert into tbl5 values (%s);", s); 

Это до вас, чтобы убедиться, что query достаточно велик.

+0

Использование 'Sprintf()' здесь, вероятно, плохой совет. См. Мой ответ за «почему». – ereOn

2

Помимо предложенных предложений, вы также можете использовать подготовленные операторы со связанными параметрами (это также полезно, если вы намерены повторять инструкцию несколько раз с разными параметрами). см sqlite3_prepare_v2sqlite3_bind_* и для получения дополнительной информации

sqlite3_stmt *stmt; 

// Create a prepared statement. 
Err = sqlite3_prepare_v2(DB, "insert into tbl5 values (?)", -1, &stmt, NULL); 
if (Err != SQLITE_OK) 
{ 
    //... 
} 

// Bind our string to the statement. 
Err = sqlite3_bind_text(stmt, 1, "some string", -1, SQLITE_TRANSIENT); 
if (Err != SQLITE_OK) 
{ 
    //... 
} 

// Execute the statement. 
Err = sqlite3_step(stmt); 
if (Err != SQLITE_DONE) 
{ 
    //... 
} 

// Free the prepared statement. 
Err = sqlite3_finalize(stmt); 
Смежные вопросы