Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Базы данных > SQLite и С++ |
Автор: Coocky 3.8.2005, 16:22 |
Итак, скачал я 213 Кб файлов с расширением *.С и *.H а так же билиотеку sqllite3.dll Что делать дальше? |
Автор: sergejzr 3.8.2005, 20:20 | ||
Да, много воды утекло с тех пор, как я последний раз брался за SQLite. Сорри, я конечно не мог знать, что они конкретно поменяли интерфейс. Но это не беда, конечно ![]() ![]() К сожалению в прошлый раз я дал тебе ссылочку на старую версию. Чтобы не топтаться на месте переходим на новейшую: http://www.sqlite.org/sqlite-source-3_2_2.zip вот helloword'ик (работает, но будет ещё меняться)
Теперь создаём проект. Самый быстрый способ: Рспаковываем архив в папку. Берём вышеописанный пример и сохраняем его в той же папке как (например) sergej.cpp Открываем sergej.cpp в VC6 и просим закомпилить. Компилер ругается на unresolved symbols. Открываем таб FileView и правой кнопкой мыши в меню выбираем "add Files to Project". Забираем ВСЕ *.с файлы кроме: shell.c и tclsqlite.c. Компилируем. Всё! Как альтернативу, подсоеденю готовый проект. |
Автор: sergejzr 3.8.2005, 20:55 |
Вот тоже неплохой пример работы. Там так же описываются примеры работы вторым способом - через sqlite3_prepare() sqlite3_step() http://www.adp-gmbh.ch/sqlite/bind_insert.html Таким образом можно забирать результат строка за строкой. |
Автор: Kurt 4.8.2005, 00:32 |
Кстати, кто-то мне говорил, что в SQLite проблемы с удалением записей - приходилось копировать таблицу, убивать и заново воссоздавать. В новых версиях SQLite эта проблема решена? P.S. Сории за оффтоп, просто интересно очень.. |
Автор: sergejzr 4.8.2005, 00:45 | ||
![]() Проблема сводится к вырезанию части контента из файла. Так что решить её однозначно никогда и нигде не удастся. Хотим удалить физически, надо переписывать файлы БД чтобы не оставалось там "пустых" мест. В новой версии есть "autovacuum", который эту процедуру будет повидимому автомвтически делать. Я к сож. первый раз за 2 года за SQLite взялся, поэтому точно говорить не буду. Раньше это делалось коммандой "vacuum" |
Автор: Coocky 4.8.2005, 10:32 |
Так, sergej.z, начинаю пробовать. Думаю эта тема хорошо разовьется. Сейчас проблема сохранения данных без привязки к установки базы-очень актуальна. Раньше пользовались файлами DBF, но сейчас на них бесплатных библиотек нет.А в Инете много встречается просьб.SQLite-лучшая тому альтернатива. Думаю, если хорошо пойдет, тема будет большой, и можно FAQ смело делать.. ![]() |
Автор: Coocky 4.8.2005, 11:55 | ||
sergej.z Твой пример работает. Только вот в 7 студии я не могу так сделать! Пишет
Итак со всеми файлами.. |
Автор: sergejzr 4.8.2005, 12:06 |
ээээ седьмой у меня нет. И не будет ![]() Это компилерские приколы. А может она вообще си не понимает? Можно в либу скомпилить конечно. |
Автор: Coocky 4.8.2005, 12:19 |
B в смысле библиотеку подключить sqlite3.dll? А пример под либу можешь преписать? ![]() |
Автор: Coocky 4.8.2005, 12:55 | ||||
Так Сережа, работаем дальше! Для тех , кто не понял, добавлякм файлы... Project->Add Existing Item, и выбираю файлы с расширеним *.C, как писал sergej.z А потом в свойствах проекта делаем
Все работает.. ![]() Итак, дальше.. Попробоввал я в коде сделать
Появилась библиотека Dima.dll Я так понял это моя база? Добавлено @ 12:58 Вообще,sergej.z, может вкратце описать создание базы, открытие, выполнение всех запросов, закрытие ![]() |
Автор: DENNN 4.8.2005, 13:03 | ||
Может быть простой Rebuild All помог бы? |
Автор: Coocky 4.8.2005, 13:23 |
DENNN Нет, это проблема в файлах, потому, что они на С написаны, а не на С++ |
Автор: Coocky 4.8.2005, 14:07 |
Итак давйте для начала возьмем три кита sqlite3_open()-Открывает/создает базу данных sqlite3_exec() -Выполняет запрос.Весь синтаксис у них описан... sqlite3_close()-Собсвтенно закрывает базу.. Ну что,sergej.z, давай потренируемся на создании трех таблиц.. Я предлагаю это тебе, хотя буду пробывать сам ![]() |
Автор: Coocky 4.8.2005, 14:18 |
Так, все нормально, теперь вопрос, как ходить по записям, кроме как int myCallback(void*,int,char**, char**); |
Автор: Coocky 4.8.2005, 16:49 | ||
Первые проблемы.. Не отрабатывает функция в классе
Все нормально i, возвращает ноль, а вот до функции дело не доходит... |
Автор: Coocky 4.8.2005, 17:12 |
Нет, тут есть проблемка, все таки, запросы правильные... Серега, ты хоть отвечай, а то я сам с собой болтаю.... |
Автор: Coocky 4.8.2005, 17:48 | ||
sergej.z А вот действительно проблема И так, запускаем твою прогу первый раз.Все нормально.. Теперь коменнтируем добавление записей..Я их удалю
Вот тут и проблема, записи все пустые, такое ощущение, что все перезаписывется, в чем проблема? |
Автор: sergejzr 4.8.2005, 20:53 | ||||||||||||||
Привет ![]() ![]() ![]()
Нет, всё нормально. Просто надо после добавления выполнить commit. Тогда все изменения действительно войдут в силу. Я исправил код - пример. Обрати внимание на добавленный:
Это главное. теперь пройдусь по предыдущим постам ![]()
Либу чтобы подключить, ничего переписывать не надо. Она ведь тоже самое, что и скомпилленые обьекты. А вот чтобы длль подсоеденить, надо ессно писать подгрузку функций из неё. Если время будет, добавлю так же.
Ты имеешь ввиду понвился файл Dima.db ![]() Да, это и есть файл базы.
Дык в примере вроде всё описано в комментарах
sqlite3_prepare(), sqlite3_step(). Примеры по линьку, который я давал в одном из первых сообщений. Время будет, добавлю свой пример. Пока очень занят..
Наверное записей нет таких. |
Автор: Coocky 5.8.2005, 11:13 |
sergej.z Держи плюс ![]() Да, и еще забыл спросить, нормально будет работать со статической компоновкой? Я вроде у других проверял, так файл без расширения dll... И еще,sergej.z, я что-то плохо понимаю, но не нахожу техх нюансов , в мануале, типа commit... Если можно, напиши, а я пока по MFC пройдусь ![]() |
Автор: sergejzr 5.8.2005, 14:38 | ||||
Да, конечно. У всего есть свои плюсы и минусы. например Длльку можно будет быстро заменить при апдейте, за это надо её всегда за собой таскать + подгружать каждый раз. Статическая компоновка позволит сделать один файл, но при обновлении самой SQLite Всё надо будет заного компилить. Хотя конечно, если тебя сегодняшняя версия устраивает, зачем вообще обновлять? ![]()
Ну это вообще то теория баз данных. С библиотекой имеет мало общего, разве что последняя её имплементирует. begin-> начало трансакции commit -> конец трансакции. Это в любой нормальной БД. Почитай какую нибудь литературу по теории БД. |
Автор: sergejzr 5.8.2005, 16:28 | ||
Итак пример первый теперь с возможностью динамической подгрузки и использования sqlite3_step();(пример 2) Осталась небольшая непонятка. В callback поидее с расстоянием в columns должны лежать типы данных. Но это не так. Где их там взять - ума не приложу. sqlite3_step работает отлично. Да и я бы его рекомендовал конечно вместо callback. И интерфейс его в этой версии намного удобней ![]()
|
Автор: Coocky 5.8.2005, 18:11 | ||
sergej.z Найди ошибку... (не создается первичный ключ)
|
Автор: sergejzr 5.8.2005, 18:29 | ||
Вообще в SQLite все типы - string. И существует только int primary key. Остальные декларации полей просто чисто для информации. Можешь туда писать что хочешь, всё игнорируется. Вообще, прежде чес работать с базой прочитай про http://www.sqlite.org/lang.html. А я пока попробую наваять тебе запросы ![]() Добавлено @ 18:31 Так же SQLite сам генерит ID для просмотра тебе надо написать например: select *,ROWID from ..... итд. Добавлено @ 18:35 Когда добавляешь NULL вместо ключа, он генерится автоматом. Вот так это надо делать:
|
Автор: Coocky 5.8.2005, 21:56 | ||||
sergej.z Спасибо!
Не веришь, как я горю с проектом ![]() Поэтому и пользуюсь этим топиком, в своих целях, а заодно и для других. ![]() Кстати я тоже не стою на месте, и уже знаю ответы на многие вопросы при работе с SQLite в среде МФС ( а проблем хватает!), но они уже решены.. ![]() Кстати, насчет скорости, сложные запросы еще не делал, а вот код при создании базы и таблиц немного подвисат. Не сильно, на секунду. но все же. Но думаю это в порядке вещей.. ![]() Добавлено @ 22:00
Вообще-то callback-нормальный вариант, хотя немного неудобный, для каждого запроса(который отличается от предыдущего) приходится добавлять новую фукнцию, если я хочу присвоить другим переменным даные, хотя написав сво класс от этого можно избавится.. ![]() |
Автор: Coocky 6.8.2005, 11:01 |
sergej.z а пример твой не рабочий... ![]() Добавлено @ 11:03 А вот если NULL убрать, то рабочий.. ![]() |
Автор: Vatel 7.8.2005, 06:37 |
Добрый день, пробовал компилировать helloword'ик, у меня не вышло. Компилятор Borland C++ v.5.02 выдал такой вот Message Info :Compiling D:\SQLProject\gendb.c Warn : gendb.c(95,2):Parameter 'argc' is never used Warn : gendb.c(76,2):'rc' is assigned a value that is never used Warn : gendb.c(103,2):Parameter 'NotUsed' is never used Warn : gendb.c(105,2):Undefined structure 'sqlite3' Warn : gendb.c(105,2):Undefined structure 'sqlite3_stmt' Warn : gendb.c(105,2):Undefined structure 'sqlite3_context' Warn : gendb.c(105,2):Undefined structure 'Mem' Info :Linking D:\SQLProject\gendb.exe Error: Error: Unresolved external '_sqlite3_open' referenced from D:\SQLPROJECT\GENDB.OBJ Error: Error: Unresolved external '_sqlite3_errmsg' referenced from D:\SQLPROJECT\GENDB.OBJ Error: Error: Unresolved external '_sqlite3_exec' referenced from D:\SQLPROJECT\GENDB.OBJ Error: Error: Unresolved external '_sqlite3_close' referenced from D:\SQLPROJECT\GENDB.OBJ Подскажите в чем загвостка |
Автор: sergejzr 7.8.2005, 13:34 | ||||||||
Да, autoincrement не нужен NULL ![]() Vatel, пишет ведь,
Я вверху уже писал, что *.с файлы надо добавлять в проект отдельно.
В Бильдере естественно это не FileView , но в меню возможность добавки файлов конечно же имеется. Для начала попробуйте запустить с ДЛЛь
Сама sqlite3.dll должна лежать там же, где проект или в windows\system PS: Прицепил обновлённый файл примера. |
Автор: sergejzr 8.8.2005, 20:16 |
Ув. Vatel, когда скомпилите проект, выложите плиз helloword'ик сюда для примера ![]() |
Автор: Vatel 10.8.2005, 14:24 | ||
Добрый день, попробовал запустить исходничек с Dll, заработало. Делал так: Создавал директорию, туда сбрасывал примерчик от 7.8.2005, 13:34 и Dll'ку. (больше ничего делать не пришлось) Сейчас сижу разбираюсь, вот состряпал по аналогии свой helloWorld'ик. прога перебирающая все html-файлы в директории на основе их сама заполняет БД, Можно вводить SQL - запросы с консоли результаты будут выводится в файл в html - формате.
|
Автор: sergejzr 10.8.2005, 14:29 |
Прекрасно! Рад, что получилось ![]() Всё же попробуйте статиком скомпилить, чтобы длльку не таскать за собой (в этом конечно большое преимущество SQLite) |
Автор: Vatel 11.8.2005, 13:07 | ||||||
Добрый день, пытался более подробно разобраться с примерчиком от 7.8.2005, 13:34 и наткнулся на такие строки
я так понял это описание ползовательского типа данных, но оно какоето непонятное, вот если бы я увидел нечто вроде
то до меня бы дошло, а вот
ни как в голове не укладывается. Обьясните плиз чего это значит то (или хотябы ссылку на доки дайте). |
Автор: sergejzr 11.8.2005, 13:22 | ||
Непрозрачная структура. Просто обьявление, что такой тип данных где то в программе определён. Так как поля этой структуры не используются в нашем коде, их и не нужно определять. Мы пользуемся функциями возвращающими этот указатель и передаём его опять же в функции. Самим указателем мы не пользуемся. PS: это как обьявление:
|
Автор: patison 31.1.2007, 22:47 |
Здравствуйте! Скачал я архив с хидерами и .c-файлами. Но подключать всё это к проекту, по некоторым причинам, не очень удобно. Если я правильно понял, я могу не подключать к своему проекту все .h и .c, а могу использовать dll, из предложенного архива. Объясните пожалуйста, как мне прилинковать функции из длл к проекту. (надеюсь, прально выразился ![]() Спасибо за помощь |
Автор: sergejzr 31.1.2007, 22:53 |
http://forum.vingrad.ru/index.php?showtopic=60377&view=findpost&p=484951 находится пример кода с описанием и комментами. Необходимо будет только в проекте только sqlite.h. ДЛЛ динамически подгружается во время работы программы. Кстати не уверен точно, но вроде бы в этой теме архив цеплял с работающим примером даже. |
Автор: patison 1.2.2007, 00:45 |
Спасибо, Сергей! Я действительно не обратил внимание на приведенный выше пример. Теперь всё работает! ![]() |
Автор: wotker 17.2.2008, 16:51 |
Хочу вытащить некоторые поля из базы данных firefox-а. ее имя mozStorage.db. rc = sqlite3_open("mozStorage.db", &db); rc = sqlite3_exec(db, "SELECT Title, FROM moz_history;", callback, 0, &zErrMsg); Появляются след. вопросы: mozStorage не виден. rc равен нулю. тоесть создается новая db. Вопрос такой: как узнать что создается новая база данных, а не используется старая? И как увидеть список всех баз данных на компьютере? |
Автор: sergejzr 17.2.2008, 18:27 |
Вы должны понимать, что база данных SQLite - обыкновенный файл. Поэтому список всех баз на компьтере можно получить толъко проверив последовательно каждый файл на диске на наличие формата SQLite. Надо указывать полный путь к файлу |
Автор: sergex 20.2.2008, 22:34 |
Спасибо всем кто написал данный топик, который мне очень помог, благодаря ему разобрался в азах работы с sqlite . В ходе работы возник вопрос: есть БД в которой 2 таблицы table1 и table2, опишите в двух словах как можно осуществить поиск по базе в общем и для каждой таблицы в частности и как можно обработать результать. |
Автор: sergejzr 21.2.2008, 01:06 |
Что конкретно непонятно по http://forum.vingrad.ru/index.php?showtopic=60377&view=findpost&p=484951? |
Автор: sergex 21.2.2008, 13:30 |
В ссылке я разглядел режим создания, добавления и удаления забисей в БД Интересует описание функции которая возвращала бы список всех таблиц в базе, а так функции которая бы искала определенное значение в определенном столбце определенной таблицы и возвращала строку результата из этой таблийцы, предполагаю что это можно сделать через функцию sqlite3_exec но какие передавать при этом параметры не соображу. |
Автор: sergex 21.2.2008, 15:04 | ||
Получается описание функции которая возвращала бы список всех таблиц в базе выглядит так?
а результат находится в функции callback? Тогда вопрос - результат запроса SELECT * FROM sqlite_master WHERE type = "table" представляет собой массив строк находящийся в массиве rows функции callback ? |
Автор: sergejzr 21.2.2008, 15:46 | ||
да. Можно распечатать и посмотреть. Но мой совет не пользоваться callback, а троицей prepare/step/finalize это удобнее и более контролируемо. В примере это показано после коммента "//произведём SELECT способом 2:" |
Автор: sergex 21.2.2008, 18:19 |
Спасибо за быстрый и содержательный ответ. ![]() Ушел учить синтаксис SQL запросов |
Автор: Alca 17.4.2009, 16:23 |
A SQLite с блобами дружит? |
Автор: sergejzr 17.4.2009, 22:57 |
SQLite дружит исключительно со строками. Если желаете хранить БЛОБ, надо будет сперва байты кодировать например в base64 и при получении раскодировать обратно (можно конечно свой обработчик подвесить и облегчит часть процессов). |
Автор: Alca 17.4.2009, 23:05 |
![]() Добавлено через 57 секунд Есть ли готовые классы для работы с SQLite? |
Автор: SenkraD 21.4.2009, 18:33 |
http://www.codeproject.com/KB/database/CppSQLite.aspx пойдёт? |
Автор: Alca 21.4.2009, 19:34 | ||
Сейчас гляну. |
Автор: needDrivers 12.5.2009, 14:13 |
Кто-нибудь пробовал пересобрать amalgamation с опцией SQLITE_ENABLE_UPDATE_DELETE_LIMIT? Я не смог найти информации от том, как они собирают всё в один большой файл? |