SQLite в Lazarus

SQLiteSQLite — это встраиваемая библиотека, позволяющая нам управлять базой данных в нашем приложении без сервера, типа 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

cmd

В той же папке с программой 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.  Скачать готовый проект

main

 

SQLite в Lazarus обновлено: 22 февраля, 2017 автором: Oleg E.
Share

26 комментариев “SQLite в Lazarus

  1. Олег не могли бы вы написать о демонах в Lazarus. а то как то замудрено везде пишут.

    • Вадим приветствую. Хорошо, в планах я поставлю себе пометку описать процесс создания службы\демона cool

  2. Не могу понять, как сделать это «После чего требуется установить пакет sqlite3laz который по умолчанию поставляется с Lazarus и пересобрать наш IDE.». Скачивать автоматически не хочет, а после того как нашел какой то архив с вроде как тем самым пакетом, заменил им содержимое в папке с лазарусом, то при запуске проги появилось окно с ошибкой «невозможно найти MDE» или что то таке

    • Зачем вам что-то скачивать? Я же написал, данный пакет расширений уже у вас должен быть по умолчанию, его лишь надо «активировать»

  3. Здравствуйте, Олег!
    Подскажите пожалуйста средствами Lazarus можно реализовать авторизацию пользователей и разграничение прав доступа к ресурсам . Вот на вашем примере, можно ли сделать так, чтобы можно было войти с логином и паролем и иметь доступ только на поиск данных, а другой пользователь имел возможность добавлять данные в бд и удалять или только добавлять?
    С уважением Олег

    • Приветствую Олег.
      А почему нет? Вы должны будете сделать окно входа в программу, где указывается логин и пароль, программа производит идентификацию пользователя и перед выполнением транзакции проверяет, есть ли соответствующие полномочия у данного пользователя.
      В теории все просто, над реализацией нужно немного подумать, но сложностей я думаю возникнуть не должно.

  4. Ответ будет на мой вопрос по возможности авторизации при входе в приложение средствами lazarus?

      • Вы сайт сделали в основном как портфолио и благодаря этому нашли новую работу?

        • Привет Олег,
          Нет я работаю в области информационной безопасности. Программирование — это пока лишь мое хобби smile

  5. Интересная статья спасибо, мне очень полезен блок про поиск данных, он получается будет находить с точным совпадением?

  6. Компонент SQLite3Dataset является обязательным? можно как то без него реализовать поиск данных и отображение?

  7. Здравствуйте!
    Как получить список всех таблиц в SQLite и вывести их, например, в ListBox?
    SQL-запрос выполнил: «SELECT * FROM sqlite_master WHERE type = «table» ORDER BY name», но не понимаю, как получить таки список таблиц и вывести их в ListBox.
    Спасибо.

  8. если у кого не будет работать
    в procedure TForm1.FormCreate(Sender: TObject);
    найдите строки

    try
    SQLite3Dataset1.Open;
    SQLite3Connection1.Connected:=True;
    except

    и поменяйте 2 строки местами,чтоб получилось так:
    try
    SQLite3Connection1.Connected:=True;
    SQLite3Dataset1.Open;
    except

  9. блин! dash
    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).

  10. Что не так делаю?

    Компиляция проекта, цель: 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»

    smile smile

  11. Было бы хорошо расписать подробнности. А то мало информации на русском языке

    • Информации вообще почти нет. Только опытным путём можно понять, как работать с той или иной библеотекой lazaus… dash

  12. // Скачав DLL библиотеку sqlite3.dll (под windows) ее требуется закинуть в папку с Lazarus (По умолчанию это C:\Lazarus) и в папку с проектом.//

    Это не совсем хорошо. По крайней мере для Windows лучше:
    1. создать директорию для библиотеки SQLite (например, C:\SQLite) и поместить туда библиотеку sqlite3.dll.
    2. прописать в системную переменную PATH путь до библиотеки (то есть значение переменной PATH должно выглядеть как C:\SQLite;….. где …. — это остальные директории переменной PATH)
    При этом отпадет необходимость копировать библиотеку sqlite3.dll как в папку Lazarus, так и в каждый проект, в котором используется SQLite.

  13. Создать БД и подконнектиться к ней можно при помощи стандартных компонентов доступа «искаропки», а библиотеки от самой sqlite3 можно найти в сети даже под линь и макось. Мне кажется, вы все сильно осложняете smile

  14. Отлично, то что нужно! Не понимаю что в статье не понятного, все и так разжеванно, другое дело если не знаете как работать с IDE. (Но автору статьи есть маленький совет, написать про SQLite3Connection:TSQLite3Connection; SQLite3Connection:=TSQLite3Connection.Create… это для тех кто создает приложение без гуев smile )

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *