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
Для подключения к базе данных необходимо для объекта 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 содержит базовый набор функций и свойств.
Для навигации по набору данных используются следующие методы.






















SQLite — это встраиваемая библиотека, позволяющая нам управлять базой данных в нашем приложении без сервера, типа MySQL, Oracle Database и тд. Работать с такой базой данных одновременно может несколько процессов или потоков, за исключением записи. Для записи в такую базу требуется чтобы в данный момент к ней не осуществлялось других запросов, иначе попытка записи оканчивается неудачей.






