| 
			| 
					
						| 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 | 
								|  | « Ответ #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 | 
								|  | « Ответ #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 | 
								|  | « Ответ #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 | 
								|  | « Ответ #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 | 
								|  | « Ответ #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. |  |  | 
	|  |