Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: SQLite3  (Прочитано 14592 раз)
0 Пользователей и 1 Гость смотрят эту тему.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« : 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
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 23-03-2008 20:20 » 

McZim, можно пойти несколькими путями: можно банально объединить строки (но надо экранировать зарезервированные в SQL символы!), а можно использовать шаблоны и привязку переменных.

http://www.sb-news.net/sqlite.php?page=16#sqlite3_bind_text

Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #2 : 23-03-2008 20:31 » 

RXL, да смотрел в сторону sqlite3_bind_text но не понял как оно работает. Счаз еще раз посмотрю.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 23-03-2008 20:33 » 

McZim, там написано: сперва prepare, а потом bind для каждого параметра. Параметер обозначается как "?" или именем - с префиксом "$", "@" или ":".

Код: (C)
char * query = "insert into test(num, name) values(1, ?);";

Порядок такой: сперва prepare, потом перед каждым exec делаешь bind.
« Последнее редактирование: 23-03-2008 20:34 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #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
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 23-03-2008 21:20 » 

McZim, извиняй - не exec, а step и finalize.

Только вот твое решение мне что-то кажется сомнительным: "$entry->d_name". Расскажи, что получится.
« Последнее редактирование: 23-03-2008 21:22 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #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
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 23-03-2008 21:41 » 

McZim, prepare и finalize выноси из цикла - в нем только bind и step.

У тебя в запросе две подстановки, а bind ты делаешь один, да и то не туда. Второй параметер будет NULL.

Читай внимательно доки!
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #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
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 24-03-2008 18:24 » 

McZim, а зачем ты первый параметр биндишь как строку? Не проще ли как целое?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
McZim
Команда клуба

ru
Offline Offline
Пол: Мужской
Я странный


WWW
« Ответ #10 : 25-03-2008 05:10 » 

RXL, кстати да.
Записан

The CBO without stats is like a morning without coffee. (c) T.Kyte.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines