McZim
|
|
« : 23-03-2008 19:48 » |
|
Всем привет. есть некая программа на Си, в ней я работаю с БД SQLite3 и столкнулся с такой проблемой. Допустим имею некую переменную в которой хранится имя файла, так вот в запросе "insert into" в качестве values мне нужно передать именно эту переменную, как это сделать что то не пойму, находил вот такие конструкции: rc=sqlite3_exec(db,"insert into test(num,name) values(1,/""name"/");",0,0,&ErrMsg) или rc=sqlite3_exec(db,"insert into test(num,name) values(1,/""+name+"/");",0,0,&ErrMsg) но результатов положительных я так и не увидел. name -- это допустим char *name; в ней у меня что то лежит, так вот я хочу это что то положить в БД.
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #1 : 23-03-2008 20:20 » |
|
McZim, можно пойти несколькими путями: можно банально объединить строки (но надо экранировать зарезервированные в SQL символы!), а можно использовать шаблоны и привязку переменных. http://www.sb-news.net/sqlite.php?page=16#sqlite3_bind_text
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
McZim
|
|
« Ответ #2 : 23-03-2008 20:31 » |
|
RXL, да смотрел в сторону sqlite3_bind_text но не понял как оно работает. Счаз еще раз посмотрю.
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #3 : 23-03-2008 20:33 » |
|
McZim, там написано: сперва prepare, а потом bind для каждого параметра. Параметер обозначается как "?" или именем - с префиксом "$", "@" или ":". char * query = "insert into test(num, name) values(1, ?);"; Порядок такой: сперва prepare, потом перед каждым exec делаешь bind.
|
|
« Последнее редактирование: 23-03-2008 20:34 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
McZim
|
|
« Ответ #4 : 23-03-2008 21:12 » |
|
получилось как-то так: char * query = "insert into test(num, name) values($i, $entry->d_name);"; const char *sql; sqlite3_stmt *stmt; sqlite3_prepare(db, query, -1, &stmt, 0); sqlite3_bind_text(stmt, 1, sql, -1, SQLITE_STATIC); а что в exec вставлять не понятно
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #5 : 23-03-2008 21:20 » |
|
McZim, извиняй - не exec, а step и finalize.
Только вот твое решение мне что-то кажется сомнительным: "$entry->d_name". Расскажи, что получится.
|
|
« Последнее редактирование: 23-03-2008 21:22 от RXL »
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
McZim
|
|
« Ответ #6 : 23-03-2008 21:34 » |
|
Да затея с $entry->d_name была не удачной, сейчас дела обстоят так, в цикле перебираются файлы и в этом же цикле выполняется вот это: i++; char *query = "insert into test(num, name) values(?, ?);"; const char *sql; sqlite3_stmt *stmt; sqlite3_prepare(db, query, -1, &stmt, 0); sqlite3_bind_text(stmt, 1, sql, -1, SQLITE_STATIC); rc=sqlite3_step(stmt); sqlite3_finalize(stmt); результат этого дейчтва выглядит вот так: sqlite> select * from test; | | | | |
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #7 : 23-03-2008 21:41 » |
|
McZim, prepare и finalize выноси из цикла - в нем только bind и step.
У тебя в запросе две подстановки, а bind ты делаешь один, да и то не туда. Второй параметер будет NULL.
Читай внимательно доки!
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
McZim
|
|
« Ответ #8 : 23-03-2008 23:00 » |
|
RXL, спасибо большое за помощь, я разобрался и того результат: int main(int argc, char *argv[]) { sqlite3 *db; char *ErrMsg = 0; int rc;
rc=sqlite3_open("test1.db", &db); rc=sqlite3_exec(db,"create table test(num integer,name varchar);",0,0,&ErrMsg);
char *query = "insert into test(num, name) values(?,?);"; const char *sql="file.txt"; const char *n="1"; sqlite3_stmt *stmt; sqlite3_prepare(db, query, -1, &stmt, 0);
sqlite3_bind_text(stmt, 1, n, -1, SQLITE_STATIC); sqlite3_bind_text(stmt, 2, sql, -1, SQLITE_STATIC); rc=sqlite3_step(stmt);
sqlite3_finalize(stmt); sqlite3_close(db); return 0; } и получаем: sqlite> select * from test; 1|file.txt еще раз спасибо.
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
RXL
Технический
Администратор
Offline
Пол:
|
|
« Ответ #9 : 24-03-2008 18:24 » |
|
McZim, а зачем ты первый параметр биндишь как строку? Не проще ли как целое?
|
|
|
Записан
|
... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
|
|
|
McZim
|
|
« Ответ #10 : 25-03-2008 05:10 » |
|
RXL, кстати да.
|
|
|
Записан
|
The CBO without stats is like a morning without coffee. (c) T.Kyte.
|
|
|
|