SQLite — это встраиваемая библиотека, позволяющая нам управлять базой данных в нашем приложении без сервера, типа MySQL, Oracle Database и тд. Работать с такой базой данных одновременно может несколько процессов или потоков, за исключением записи. Для записи в такую базу требуется чтобы в данный момент к ней не осуществлялось других запросов, иначе попытка записи оканчивается неудачей.
Кстати говоря, многие известные приложения используют Sqlite:
- Mozilla Firefox (начиная с версии 3.0)
- Mozilla Thunderbird
- Фреймворк Qt
- Skype
- 1С:Предприятие
- Google Chrome
- Opera
Благодаря этим приложениям, SQLite считается самой распространённой базой данных в мире.
Итак давайте попробуем создать некое приложение в котором будет использоваться база данных. Возьмем за пример «Базу сотрудников» где будет указана информация о сотрудниках некой компании, например ОАО «Devlaz.ru»
Для начала нам понадобится скачать саму библиотеку: http://www.sqlite.org/download.html
Если вы программируете под Ubuntu, Linux и других Debian-like дистрибутивы, то также требуется установить libsqlite-dev/libsqlite3-dev, не только sqlite/sqlite3.
Скачав DLL библиотеку sqlite3.dll (под windows) ее требуется закинуть в папку с Lazarus (По умолчанию это C:\Lazarus) и в папку с проектом.
После чего требуется установить пакет sqlite3laz который по умолчанию поставляется с Lazarus и пересобрать наш IDE.
С помощью sqlite3.exe скаченного с офф. сайта создаем базу данных:
Откроем CMD, перейдем в рабочий каталог sqlite3.exe, например диск С(в данной папке должен быть наш sqlite3.exe)
В командной строке пишем: sqlite3.exe devlaz.db
где devlaz.db имя вашей базы данных.
Должно появится окно приветствия:
SQLite version 3.12.2 2016-04-18 17:30:31
Enter «.help» for usage hints.
Создаем внутри таблицу с именем например devlaz, в которой будет 3 поля: Порядковый номер, ФИО и Телефон: create table devlaz(id integer primary key, fio string, tel string);
Данные в таблицу мы будем добавлять из программы поэтому завершим работу с sqlite3.exe вводом команды: .exit
В той же папке с программой sqlite3.exe должен появится наш файл db, закидываем его в папку с проектом.
Теперь перейдем к созданию приложения. Готовое приложение вы сможете скачать в конце статьи.
Для начала добавьте на форму компоненты TSQLite3DataSet с вкладки Data Access, TSQLite3Connection, TSQLQuery и TSQLTransaction с вкладки SQLdb. А для отображения данных нашей базы я добавил на форму DBGrid и TDataSource.
Теперь для того чтобы наша база загружалась с запуском программы, на FormCreate добавим следующий код:
procedure TForm1.FormCreate(Sender: TObject); begin {Параметры компонентов работы с базой Можно выставить в опциях у каждого компонента.} //******************************* SQLite3Dataset.FileName:='devlaz.db'; SQLite3Dataset.TableName:='devlaz'; DataSource.DataSet:=SQLite3Dataset; SQLite3Connection.DatabaseName:='devlaz.db'; SQLite3Connection.Transaction:=SQLTransaction; SQLTransaction.DataBase:=SQLite3Connection; SQLQuery.DataBase:=SQLite3Connection; SQLQuery.Transaction:=SQLTransaction; //******************************* try SQLite3Dataset.Open; SQLite3Connection.Connected:=True; except On E:Exception do ShowMessage('Ошибка открытия базы: '+ E.Message); end; end;
Создадим на форме 2-ве кнопки, для добавления новой записи и удаления. А также 3-и Edit’a для наших данных ID, ФИО и Тел.
Для создания новой записи впишем след. код:
procedure TForm1.ButtonAddClick(Sender: TObject); begin SQLite3Dataset.Close; with SQLQuery do begin SQL.Clear; SQL.Add('INSERT INTO devlaz(fio, tel) VALUES(:FIO,:TEL)'); ParamByName('FIO').Text:=EditFIO.Text; ParamByName('TEL').Text:=EditTEL.Text; ExecSQL; SQLTransaction.Commit; Close; end; SQLite3Dataset.Open; end;
Поле id добавится автоматически, согласно след. порядковому номеру, поэтому его мы не указываем в запросе.
Для удаления записи будем использовать ID записи:
procedure TForm1.ButtonDelClick(Sender: TObject); begin SQLite3Dataset.Close; with SQLQuery do begin SQL.Clear; SQL.Add('DELETE FROM devlaz where id=:ID'); ParamByName('ID').Text:=EditID.Text; ExecSQL; SQLTransaction.Commit; Close; end; SQLite3Dataset.Open; end;
Вы можете откорректировать ваш SQL запрос на свое усмотрение, например удаление по ФИО или номеру телефона.
Ну и напоследок представим ситуацию что нам нужно найти определенную запись по какому-то критерию, допустим это будем ID, после чего вывести фамилию по этой записи как сообщение. Для этого добавим еще одну кнопку и назначим ей след. код:
procedure TForm1.ButtonFindClick(Sender: TObject); begin with SQLQuery do begin SQL.Clear; SQL.Add('SELECT * FROM devlaz where id = :id'); ParamByName('id').Text:=EditID.Text; Open; end; ShowMessage(SQLQuery.FieldByName('fio').AsString); SQLQuery.Close; end;
Вот мы и познали азы работы с SQLite. Скачать готовый проект
Олег не могли бы вы написать о демонах в Lazarus. а то как то замудрено везде пишут.
Вадим приветствую. Хорошо, в планах я поставлю себе пометку описать процесс создания службы\демона
Не могу понять, как сделать это «После чего требуется установить пакет sqlite3laz который по умолчанию поставляется с Lazarus и пересобрать наш IDE.». Скачивать автоматически не хочет, а после того как нашел какой то архив с вроде как тем самым пакетом, заменил им содержимое в папке с лазарусом, то при запуске проги появилось окно с ошибкой «невозможно найти MDE» или что то таке
Зачем вам что-то скачивать? Я же написал, данный пакет расширений уже у вас должен быть по умолчанию, его лишь надо «активировать»
Здравствуйте, Олег!
Подскажите пожалуйста средствами Lazarus можно реализовать авторизацию пользователей и разграничение прав доступа к ресурсам . Вот на вашем примере, можно ли сделать так, чтобы можно было войти с логином и паролем и иметь доступ только на поиск данных, а другой пользователь имел возможность добавлять данные в бд и удалять или только добавлять?
С уважением Олег
Приветствую Олег.
А почему нет? Вы должны будете сделать окно входа в программу, где указывается логин и пароль, программа производит идентификацию пользователя и перед выполнением транзакции проверяет, есть ли соответствующие полномочия у данного пользователя.
В теории все просто, над реализацией нужно немного подумать, но сложностей я думаю возникнуть не должно.
Ответ будет на мой вопрос по возможности авторизации при входе в приложение средствами lazarus?
UP, новая работа совсем не оставляет мне свободного времени
Вы сайт сделали в основном как портфолио и благодаря этому нашли новую работу?
Привет Олег,
Нет я работаю в области информационной безопасности. Программирование — это пока лишь мое хобби
Интересная статья спасибо, мне очень полезен блок про поиск данных, он получается будет находить с точным совпадением?
Компонент SQLite3Dataset является обязательным? можно как то без него реализовать поиск данных и отображение?
Здравствуйте!
Как получить список всех таблиц в SQLite и вывести их, например, в ListBox?
SQL-запрос выполнил: «SELECT * FROM sqlite_master WHERE type = «table» ORDER BY name», но не понимаю, как получить таки список таблиц и вывести их в ListBox.
Спасибо.
если у кого не будет работать
в procedure TForm1.FormCreate(Sender: TObject);
найдите строки
…
try
SQLite3Dataset1.Open;
SQLite3Connection1.Connected:=True;
except
…
и поменяйте 2 строки местами,чтоб получилось так:
try
SQLite3Connection1.Connected:=True;
SQLite3Dataset1.Open;
except
если используете код автора то единички в именах объектов уберите
Спасибо!
блин!
win7 х64
поставил пакет sqlite3laz, перекомпилился IDE и lazarus больше не запускается.
sqlite.dll is missing
(на сайте http://www.sqlite.org/download.html скачивается sqlite3.dll)
переименовал в sqlite.dll — тоже не запускается, выкидывает ошибки на бракованный длл (entry-point not found для х64 и еще что то более мрачное для х86).
Используйте dll из архива x86, и Lazarus запуститься без ошибок.
Что не так делаю?
Компиляция проекта, цель: project1.exe: Код завершения 1, ошибок: 37
unit1.pas(46,3) Error: Identifier not found «SQLite3Dataset»
unit1.pas(47,3) Error: Identifier not found «SQLite3Dataset»
unit1.pas(48,3) Error: Identifier not found «DataSource»
unit1.pas(48,23) Error: Identifier not found «SQLite3Dataset»
unit1.pas(49,3) Error: Identifier not found «SQLite3Connection»
unit1.pas(50,3) Error: Identifier not found «SQLite3Connection»
unit1.pas(50,34) Error: Identifier not found «SQLTransaction»
unit1.pas(51,3) Error: Identifier not found «SQLTransaction»
unit1.pas(51,28) Error: Identifier not found «SQLite3Connection»
unit1.pas(52,3) Error: Identifier not found «SQLQuery»
unit1.pas(52,22) Error: Identifier not found «SQLite3Connection»
unit1.pas(53,3) Error: Identifier not found «SQLQuery»
unit1.pas(53,25) Error: Identifier not found «SQLTransaction»
unit1.pas(57,6) Error: Identifier not found «SQLite3Dataset»
unit1.pas(58,6) Error: Identifier not found «SQLite3Connection»
unit1.pas(69,3) Error: Identifier not found «SQLite3Dataset»
unit1.pas(71,8) Error: Identifier not found «SQLQuery»
unit1.pas(71,17) Error: Expression type must be class or record type, got
unit1.pas(73,5) Error: Identifier not found «SQL»
unit1.pas(74,5) Error: Identifier not found «SQL»
unit1.pas(75,5) Error: Identifier not found «ParamByName»
unit1.pas(75,34) Error: Identifier not found «Edit1»
unit1.pas(76,5) Error: Identifier not found «ParamByName»
unit1.pas(76,33) Error: Identifier not found «Edit2»
unit1.pas(77,5) Error: Identifier not found «ExecSQL»
unit1.pas(78,5) Error: Identifier not found «SQLTransaction»
unit1.pas(82,3) Error: Identifier not found «SQLite3Dataset»
unit1.pas(88,3) Error: Identifier not found «SQLite3Dataset»
unit1.pas(90,8) Error: Identifier not found «SQLQuery»
unit1.pas(90,17) Error: Expression type must be class or record type, got
unit1.pas(92,5) Error: Identifier not found «SQL»
unit1.pas(93,5) Error: Identifier not found «SQL»
unit1.pas(94,5) Error: Identifier not found «ParamByName»
unit1.pas(94,29) Error: Identifier not found «EditID»
unit1.pas(95,5) Error: Identifier not found «ExecSQL»
unit1.pas(96,5) Error: Identifier not found «SQLTransaction»
unit1.pas(100,3) Error: Identifier not found «SQLite3Dataset»
все понял причина плохое знание основ
Было бы хорошо расписать подробнности. А то мало информации на русском языке
Информации вообще почти нет. Только опытным путём можно понять, как работать с той или иной библеотекой lazaus…
Не заработало. Очень нечеткие объяснения…
// Скачав DLL библиотеку sqlite3.dll (под windows) ее требуется закинуть в папку с Lazarus (По умолчанию это C:\Lazarus) и в папку с проектом.//
Это не совсем хорошо. По крайней мере для Windows лучше:
1. создать директорию для библиотеки SQLite (например, C:\SQLite) и поместить туда библиотеку sqlite3.dll.
2. прописать в системную переменную PATH путь до библиотеки (то есть значение переменной PATH должно выглядеть как C:\SQLite;….. где …. — это остальные директории переменной PATH)
При этом отпадет необходимость копировать библиотеку sqlite3.dll как в папку Lazarus, так и в каждый проект, в котором используется SQLite.
Создать БД и подконнектиться к ней можно при помощи стандартных компонентов доступа «искаропки», а библиотеки от самой sqlite3 можно найти в сети даже под линь и макось. Мне кажется, вы все сильно осложняете
Отлично, то что нужно! Не понимаю что в статье не понятного, все и так разжеванно, другое дело если не знаете как работать с IDE. (Но автору статьи есть маленький совет, написать про SQLite3Connection:TSQLite3Connection; SQLite3Connection:=TSQLite3Connection.Create… это для тех кто создает приложение без гуев )