1. Главная страница » Компьютеры

Lazarus работа с базами данных

Автор: | 16.12.2019
16.04.2009
aRix

Продолжая осваивать работу с базами данных в Lazarus, я решил посмотреть, как реализовать работу с удаленным MySQL сервером. У меня есть небольшой сайт на самописном PHP движке, который берет информацию из MySQL базы данных. Таблица со статьями называется myArtTable и имеет простую структуру (Id, text, description и keywords). Мне всегда хотелось иметь инструмент, с помощью которого можно было бы в обход браузера работать с контентом сайта. Собственно написанием такой штуковины я и предлагаю заняться, а попутно объяснить Вам механизмы работы с базой данных в Lazarus.

TMySQL50Connection, TSQLTransaction, TSQLQuery – компоненты для работы с базой данных

Создайте пустой проект. В папку проекта необходимо скопировать библиотеку DLL для работы с MySQL. Скачать ее можно здесь: libmysql.dll.

На моем Web сервере установлен MySQL 5.03, поэтому, следуя рекомендациям, приведенным в статье "Использование SQLdb в Lazarus: основы работы с базами данных", я помещаю на форму компоненты TMySQL50Connection, TSQLTransaction, TSQLQuery из панели SQLbd; и компонент TDatasource из панели Data Access.

Настроим связи между этими компонентами.

  • В свойстве Transaction объекта MySQL50Connection1 выберите SQLTransaction1 (я не менял присваиваемые по умолчанию имена объектов).
  • В свойстве Database объекта SQLQuery1 выберите MySQL50Connection1
  • В свойстве Transaction объекта SQLQuery1 выберите SQLTransaction1
  • В свойстве DataSet объекта Datasource1 выберите SQLQuery1
Читайте также:  Iphone на авито отзывы

Для подключения к базе данных необходимо для объекта MySQL50Connection1 указать адрес сервера (свойство HostName), название базы данных (свойство DatabaseName), имя пользователя (свойство UserName) и пароль для доступа к базе данных (свойство Password). Если Вы подключаетесь к базе данных на своем web сервере, значения этих свойств можно узнать у Вашего хостера. В моем случае я просто зашел в панель управления сайтом и скопировал все необходимые мне поля из соответствующего раздела.

Объекты класса TSQLQuery представляют собой наборы данных. В него загружается копия таблицы с сервера БД, с которой потом и осуществляется вся работа.

TSQLQuery поддерживает два принципиально разных способа доступа к данными: навигационный, который заключается в обработке каждой отдельной(текущей) записи(строки) таблицы; и реляционный, основанный на обработке сразу группы записей, посредствам SQL-запросов.

Реляционный способ доступа к данным

Сначала познакомимся с реляционным способом доступа к данным, в частности рассмотрим способы выполнения SQL запросов. SQL запросы можно разделить на две группы: возвращающие и не возвращающие результат. Например, запрос подразумевает запись в набор данных копии таблицы myArtTable. Для его выполнения нужно использовать код:

Мы сначала закрываем набор данных SQLQuery1, вызывая его метод Close (Аналогичного результата можно добиться установив свойство Active в false). Если набор закрыт, его связь с базой данных разорвана. Затем мы очищаем свойство SQL с помощью метода Clear. С помощью метода Add записываем в него текст нового запроса. Исполняется запрос при выполнении команды Open, которая переводит набор данных SQLQuery1 в открытый режим и записывает в него результаты выполнения SQL запроса.

Если SQL запрос не подразумевает возврата таблиц данных (запросы INSERT и UPDATE), необходимо воспользоваться альтернативным способом его выполнения:

При этом, при попытке перевести набор данных в открытый режим (выполнить SQLQuery1.Open;) возникнет ошибка. Для ее устранения нужно либо записать в свойство SQL новый запрос, возвращающий таблицу, так показано ниже:

Либо создать и использовать для таких SQL запросов отдельный набор данных (SQLQuery2), который никогда не переводить в открытый режим.

Подключение и отключение от базы данных в Lazarus

Будем подключаться к удаленной базе данных не сразу, а после получения явной команды от пользователя (щелчка по соответствующей кнопке), поэтому установим в инспекторе объектов свойство Сonnected компонента TMySQL50Connection и свойства Active компонент TSQLTransaction и TSQLQuery в false.

Создадим на форме кнопку «Подключиться». В обработчике нажатия напишем:

Таким образом, сначала производится попытка подключения к MySQL базе, если она прошла успешно, создается новая транзакция, после чего при активации объекта SQLQuery1 выполняется SQL запрос к базе данных, выбирающей все строки из таблицы. Перед тем, как получить таблицу с сервера, необходимо соответствующим образом настроить кодировки. В моей базе данные хранятся в кодировке cp1251, поэтому я выполняю запрос

При отключении от базы данных действуем в обратном порядке. Зададим код отключения в обработчике события OnDestroy формы

Навигационный способ доступа к данным

Навигационный способ подразумевает последовательную работу с записями(строками) таблицы, содержащейся в наборе данных. На навигационном способе доступа основана работа визуальных компонент из вкладки «Data Controls». Разместим на нашей форме компоненты TDBGr >

Запустите программу и нажмите кнопу «Подключиться…». После подключения к базе данных полученная с сервера таблица будет отображаться в объекте DBGrid1. Стрелочкой слева обозначена текущая запись. С помощью кнопок панели DBNavigator1 можно перемещаться по строкам таблицы. Вы также можете редактировать записи, однако после закрытия программы все сделанные изменения сбросятся. Для их сохранения в базу необходимо вызвать метод ApplyUpdates:

Приведу методы класса TSQLQuery, предназначенные для навигации по базе:

  • TSQLQuery.Next – перейти на запись вперед
  • TSQLQuery.Prior – перейти на запись назад
  • TSQLQuery.First – перейти на первую запись
  • TSQLQuery.Last – перейти на последнюю запись
  • TSQLQuery.Insert – добавить новую запись
  • TSQLQuery.Delete – удалить запись
  • TSQLQuery.Edit – перевести набор данных в режим редактирования
  • TSQLQuery.Post – сохранить сделанные изменения в набор данных
  • TSQLQuery.Refresh – обновить таблицу

Для того чтобы получить значения какого-нибудь поля записи, можно воспользоваться методом FieldByName(fn:string), где fn – название поля (колонки) таблицы. Этот же метод можно использовать для записи новых данных в таблицу. Формат чтения/записи указывается с помощью свойств AsString, AsInteger, AsFloat, AsDataTime, … Например, чтобы записать текущее значения поля id в Label, можно воспользоваться кодом:

Приведем также пример редактирования текущей строки таблицы

Стоит отметить, что не каждый набор данных можно редактировать навигационным способом. Чтобы получить в результате SQL запроса редактируемый набор (то есть такой, что внесенные изменения можно было сохранить в базу данных), необходимо выполнение следующих условий:

  • данные отбираются только из одной таблицы;
  • таблица допускает модификацию;
  • в запросе не используется DISTINCT и статические функции;
  • в запросе не применяются соединения таблиц;
  • в запросе отсутствуют подзапросы и вложенные запросы;
  • не используется группирование данных;
  • сортировка применяется только к индексным полям;

Использование транзакций и TSQLTransaction в Lazarus

Вообще механизм транзакции необходим для сохранения целостности базы данных. Допустим, для внесения актуальных данных в базу Вам необходимо записать в разные таблицы большое количество информации. Если в процессе записи выключится электричество, то часть таблиц будут содержать актуальную информацию, а часть старую. В результате база данных окажется испорченной. Избежать этого позволяет механизм транзакций. Если все операции записи завершились успешно, транзакция считается успешной и все изменения в таблицах базы считаются подтвержденными. Если же хотя бы одна операция записи не выполнена, транзакция считается неудачной и таблицы базы данных возвращаются к состоянию, которое они имели до начала транзакции.

Для работы с транзакциями в Lazarus добавлен компонент TSQLTransaction. Однако, в настоящее время он не работает с MySQL базами данных. TSQLTransaction автоматически переходит в активное состояние при открытии набора данных (TSQLQuery) и закрывается при его закрытии. Для явного подтверждения успешности транзакции можно использовать метод TSQLTransaction.Commit. Вызывать его следует сразу после TSQLQuerty.ApplyUpdates; Для отката транзакции можно использовать метод TSQLTransaction.Rollback.

Заключение

Итак, в этой статье я постарался собрать воедино свой небольшой опыт по работе с базой MySQL из Lazarus. Механизм работы с другими базами данных в целом не отличается от описанного здесь.

Как видно из заголовка в данной статье пойдет разговор о работе с базами данных при помощи > ( язык структурированных запросов ) , который позволяет получать о обрабатывать наборы данных. По поводу синтаксиса данного языка можно почитать на википедии либо на соответствующих форумах. Мы же будет рассматривать непосредственную работу с данными.

Для начинающих работать в Lazarus в качестве первого опыта вполне подойдет стандартный набор компонентов с вкладки SQLdb, данная вкладка содержит набор для работы с различными СУБД.

Состав вкладки SQLdb.

TSQLQuery Компонент для получения и изменения данных
TSQLTransaction Компонент для работы с транзакциями
TSQLScript Компонент для работы с большим количеством Sql кода
TSQLConnector Компонент для установления подключения к различным базам данных
TMSSQLConnection Компонент для подключения к СУБД MSSql (Microsoft SQL Server)
TSybaseConnection Компонент для подключения к СУБД Sybase (Sybase SQL Server)
TPQConnection Компонент для подключения к СУБД PostgreSQL
TPQTEventMonitor Компонент для взаимодействия с событиями в PostgreSQL
TOracleConnection Компонент для работы с СУБД Oracle
TODBCConnection Компонент для доступа к данными посредством драйверов ODBC
TMySQL40Connection Компонент для подключения к СУБД MySql версии 4.0
TMySQL41Connection Компонент для подключения к СУБД MySql версии 4.1
TMySQL50Connection Компонент для подключения к СУБД MySql версии 5.0
TMySQL51Connection Компонент для подключения к СУБД MySql версии 5.1
TMySQL55Connection Компонент для подключения к СУБД MySql версии 5.5
TMySQL56Connection Компонент для подключения к СУБД MySql версии 5.6
TSQLite3Connection Компонент для подключения к СУБД SQLite
TIBConnection Компонент для подключения к СУБД Firebird, Interbase
TFBAdmin Компонент для управления сервером Firebird
TFBEventMonitor Компонент для работы с событиями Firebird, Interbase
TSQLDBLibraryLoader Компонент для загрузки библиотеки доступа к данным

Так же для работы потребуется компонент TDataSource с вкладки Data Access, он является прослойкой между компонентами для доступа к данным и компонентами для отображения данных.

Доступ к данным.

Для подключения к какой либо СУБД на форму или датамодуль следует разместить требуемый компонент. Все зависит от требуемой СУБД. Я выбрал SQLite и соответственно добавил на форму TSQLite3Connection. Он позволит настроить подключение к требуемой базе данных. Так же следует добавить на форму компонент TSQLTransaction. Он обеспечивает целостность работы с данными. О нем будет позже более подробнее.

Поскольку SQLite это локальная СУБД, то не требуется указывать такие параметры соединения как сервер, порт, пользователь, пароль, достаточно указать только путь к файлу базы и кодировку для работы, а также указать компонент для транзакции.

Сделать это можно примерно так.

Для того что бы программа заработала необходимо в папку с проектом поместить библиотеку sqlite3.dll, скачать последнюю версию которой можно тут. Для остальных СУБД тоже потребуются соответствующие библиотеки.

Что бы получить данные из базы на форму помещается компонент SQLQuery1, у него в качестве database указывается компонент SQLite3Connection1, а в качестве параметра transaction компонент SQLTransaction1.

Затем вписать в свойство SQL соответствующий запрос для выборки данных и выполнить процедуру Open. Если требуется добавить изменить или удалить данные то следует сделать ExecSQL.

После этого мы получим набор данных, если точнее таблицу. Для работы с ней компонент TSQLQuery содержит базовый набор функций и свойств.

Для навигации по набору данных используются следующие методы.

Добавление данных

Добавлять данные в таблицу можно двумя способами. Один через открытый набор данных. Второй через выполнение специального sql запроса INSERT. Рассмотрим оба способа.

Добавление данных через открытый набор данных.

Для манипулирования с данными используются следующие команды.

Изменение данных.

Изменить данные в базе можно несколькими способами. Рассмотрим два способа изменения данных при помощи компонентов Sqldb.

Первый способ будет через открытый набор данных.

Достаточно встать на требуемую запись и открыть её через процедуру Edit

Так же данные можно редактировать через sql запрос UPDATE

Удаление данных

Удалить данные из базы не сложно, главное удалить именно те данные, а не те которые были нужны. Зачастую от этого спасают транзакции и бекапы. Но не всегда. Рассмотрим так же два способа удаления данных.

Удаление из набора данных. Просто становимся на требуемую запись и выполняем следующий код.

Также удалить данные можно через sql запрос DELETE, делается это следующим образом.

При удаление данных через запрос нужно точно знать какие данные удалять. Если сделать так.

То удаляться все данные из таблицы table1. Поэтому требуется точно указывать какие данные удалять.

Поиск данных.

Поиск данные является одной из необходимых вещей при работе с базами данных. Существует несколько способов осуществления данной операции. Не будем рассматривать все. Остановимся на самых простых.

Первым способом будет поиск в выбранном наборе данных. Он осуществляется по конкретному столбцу или столбцам данных. Выглядит это так.

При использование данной записи маркер выбранной записи переместиться на найденную запись, если искомых данных не будет обнаружено то маркер переместиться на последнюю запись.

Так же можно сделать выборку данных с условием отбора SELECT . WHERE делается это так.

Данный запрос применяется для поиска по точным данным. Если же требуется найти все похожие данные то тут применяется функция sql LIKE, позволяет задать примерный поиск значения в строках данных для конкретного столбца. Синтаксис данной функции такой

Пример использования функции из кода.

Данный запрос выведет все имена содержащие букву и.

Есть небольшая проблема у SQLite. В данной СУБД оператор LIKE поддерживаться полностью только для латиницы, для кириллицы он тоже работает но только с соблюдением регистра букв. Что бы избежать данной проблемы требуется либо использовать библиотеку sqlite3.dll с поддержкой ICU, либо использовать свою функцию LIKE.

Транзакции

Транзацкии в базах данных обеспечивают целостность и защищенность данных. Они позволяют изменить данные в базе либо вернуть предыдущее состояние данных в пределах транзакции. Имеется различный уровень изоляции данных при работе транзакций, это зависит от используемой СУБД.

Пример работы с транзакциями из кода.

Так же транзакции удобно использовать когда необходимо загрузить в базу большое количество данных. Поскольку транзакции ускоряют процесс работы с записями в сотни раз. Но не стоит ими злоупотреблять, поскольку неправильное их использование может привести к зависанию программ, работающих с базой.

Вот так примерно можно работать с базами данных из Lazarus при использование компонентов SQLdb. Данная статья не претендует на звание самого умного документа, а просто показывает общие методы работы с базами данных.

Блог о программировании

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 добавим следующий код:

Создадим на форме 2-ве кнопки, для добавления новой записи и удаления. А также 3-и Edit’a для наших данных ID, ФИО и Тел.

Для создания новой записи впишем след. код:

Поле id добавится автоматически, согласно след. порядковому номеру, поэтому его мы не указываем в запросе.

Для удаления записи будем использовать ID записи:

Вы можете откорректировать ваш SQL запрос на свое усмотрение, например удаление по ФИО или номеру телефона.

Ну и напоследок представим ситуацию что нам нужно найти определенную запись по какому-то критерию, допустим это будем ID, после чего вывести фамилию по этой записи как сообщение. Для этого добавим еще одну кнопку и назначим ей след. код:

Вот мы и познали азы работы с SQLite. Скачать готовый проект

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

Олег не могли бы вы написать о демонах в 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»

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

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

Copyright 2022
...