71187

MySQL+Lazarus: Работа и базой данных из Lazarus. TMySQL50Connection, TSQLTransaction, TSQLQuery – компоненты для работы с базой данных

Лабораторная работа

Информатика, кибернетика и программирование

Создайте пустой проект. В папку проекта необходимо скопировать библиотеку DLL для работы с MySQL. Скачать ее можно здесь: libmysql.dll. Разместите на форме компоненты TMySQL50Connection, TSQLTransaction, TSQLQuery из панели SQLbd; и компонент TDatasource из панели Data Access.

Русский

2014-11-03

937.82 KB

72 чел.

Лабораторные работы по дисциплине «Управление данными»

Лабораторной работе №7

MySQL+Lazarus: Работа и базой данных из Lazarus

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

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

Разместите на форме компоненты TMySQL50Connection, TSQLTransaction, TSQLQuery из панели SQLbd; и компонент TDatasource из панели Data Access.

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

  1.  В свойстве Transaction объекта MySQL50Connection1 выберите SQLTransaction1 (я не менял присваиваемые по умолчанию имена объектов).
  2.  В свойстве Database объекта SQLQuery1 выберите MySQL50Connection1
  3.  В свойстве Transaction объекта SQLQuery1 выберите SQLTransaction1
  4.  В свойстве DataSet объекта Datasource1 выберите SQLQuery1

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

DatabaseName=lab3

HostName=localhost

UserName=root

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

Доступ к данным с помощью запросов

Для выполнения запроса нужно использовать код:

SQLQuery1.Close;

SQLQuery1.SQL.Clear;

SQLQuery1.SQL.Add('Select * from ListCatalog;');

SQLQuery1.Open;

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

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

SQLQuery1.Close;

SQLQuery1.SQL.Clear;

SQLQuery1.SQL.Add('INSERT INTO myArtTable (text, description , keywords)

          VALUES('+#39+memo3.text+#39+', '+#39+memo2.text+#39+', '+#39+memo1.text+#39+');');

SQLQuery1.ExecSQL;     

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

SQLQuery1.Close;

SQLQuery1.SQL.Clear;

SQLQuery1.SQL.Add('INSERT INTO myArtTable (text, description , keywords)

          VALUES('+#39+memo3.text+#39+', '+#39+memo2.text+#39+', '+#39+memo1.text+#39+');');

SQLQuery1.ExecSQL;

SQLQuery1.SQL.Text:='SELECT * from  myArtTable;';

SQLQuery1.Open;

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

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

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

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

procedure TForm1.Button1Click(Sender: TObject);

begin

 isAllOk:=true;

 try

   MySQL50Connection1.Connected:=true;

 except

   ShowMessage(' Не могу подключиться к базе данных');

 exit;

 end;

 try

   SQLTransaction1.Active:=true;

 except

   ShowMessage(' Не могу создать транзакцию');

 exit;

 end;

 try

   SQLQuery1.Active:=false;

   SQLQuery1.SQL.Clear;

   SQLQuery1.sql.add('SET character_set_client='+#39+'utf8'+#39+',

            character_set_connection='+#39+'cp1251'+#39+',character_set_results='+#39+'utf8'+#39+';');

   SQLQuery1.ExecSQL;

   SQLQuery1.SQL.Clear;

   SQLQuery1.sql.add('SELECT * from  myArtTable;');

   SQLQuery1.Open;

 except

   ShowMessage(' Ошибка при выполнении SQL запроса.');

 exit;

 end;

end;

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

//   SET character_set_results='cp866'; /*устанавливает кодировку данных отправляемых К клиенту*/

  //   SET character_set_client='cp866';  /*устанавливает кодировку данных отправляемых ОТ клиента*/

  // SET character_set_connection='utf8' /*устанавливает кодировку, в которую преобразуется информация пришедшая от клиента, перед выполнением запроса на сервере.*/

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

procedure TForm1.FormDestroy(Sender: TObject);

begin

 SQLQuery1.Active:=false;

 SQLTransaction1.Commit;

 MySQL50Connection1.Connected:=false;

end;

Навигация по данным

Навигация основана на работе визуальных компонент из вкладки «Data Controls». Разместим на нашей форме компоненты TDBGrid, TDBNavigator и три компонента TDBMemo. И установим в их свойствах DataSource ссылку на DataSource1. В свойства DataField объектов DBMemo1  запишем Catalog_name  соответственно. (где Catalog_name– это название полей(колонок) в таблице ListCatalog.)

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

SQLQuery1.ApplyUpdates;

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

  1.  TSQLQuery.Next – перейти на запись вперед
  2.  TSQLQuery.Prior – перейти на запись назад
  3.  TSQLQuery.First – перейти на первую запись
  4.  TSQLQuery.Last – перейти на последнюю запись
  5.  TSQLQuery.Insert – добавить новую запись
  6.  TSQLQuery.Delete – удалить запись
  7.  TSQLQuery.Edit – перевести набор данных в режим редактирования
  8.  TSQLQuery.Post – сохранить сделанные изменения в набор данных
  9.  TSQLQuery.Refresh – обновить таблицу

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

Label1.caption:=SQLQuery1.FieldByName(‘id’).AsString;

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

SQLQuery1.Edit;

SQLQuery1.FieldByName(‘keywords’).AsString:=’Lazarus жжот’;

SQLQuery1.FieldByName(‘text’).AsString:=’Новый текст’;

SQLQuery1.Post;

SQLQuery1.ApplyUpdates;

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

  1.  данные отбираются только из одной таблицы;
  2.  таблица допускает модификацию;
  3.  в запросе не используется DISTINCT и статические функции;
  4.  в запросе не применяются соединения таблиц;
  5.  в запросе отсутствуют подзапросы и вложенные запросы;
  6.  не используется группирование данных;
  7.  сортировка применяется только к индексным полям;

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

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

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


 

А также другие работы, которые могут Вас заинтересовать

17721. Факторний аналіз ефективності використання парку рухомого складу 136.5 KB
  Лабораторна робота №1 Факторний аналіз ефективності використання парку рухомого складу Аналіз впливу ТЕП на економічні результати роботи АТП виконується з метою виявлення втрат через великі простої недостатнє використання вантажопідйомності автомобіля та не...
17722. Вибір рухомого складу за критерієм собівартості перевезень 98 KB
  Лабораторна робота №2 Вибір рухомого складу за критерієм собівартості перевезень Мета роботи: визначити сферу доцільного застосування рухомого складу для простого циклу перевезень Вхідні данні: Вид перевезень – контейнерні. . Маса навантажувальнорозва...
17723. Визначення автомобілів оптимальної вантажопідйомності для роботи із заданими вантажно-розвантажувальними засобами 86.5 KB
  Лабораторна робота №3 Визначення автомобілів оптимальної вантажопідйомності для роботи із заданими вантажнорозвантажувальними засобами Мета роботи: для двох екскаваторів різної продуктивності розрахувати оптимальні вантажопідйомності рухомого складу Вхідн...
17724. Визуализация информационной системы городской среды 216 KB
  Цель работы – анализ методов информационной визуализации и применение их для разработки прототипа системы поддержки конечного пользователя. В процессе работы проводился анализ возможностей геоинформационных систем как средств визуализации данных, исследовались различные методы представления географических и семантических данных.
17725. Перевезення вантажів змінними полу причепами 53.5 KB
  Лабораторна робота № 5 Перевезення вантажів змінними полу причепами. Мета роботи: Визначити необхідне число АТЗ для перевезення методом змінних полу причепів. Вхідні данні: Залізобетонні вироби з ДБК на будівництво перевозиться на автопоїздах тягачах марки ...
17726. Сучасні Транспортні Технології 3.03 MB
  ПЛАН ЛЕКЦІЙНИХ ЗАНЯТЬ ЗМ 1 Л1. Спеціалізація автотранспортних засобів Розвиток вантажного парку в світі та Україні. Спеціалізація як необхідність розвитку автомобільного транспорту. Структура СРС в Україні та за її межами та перспек
17727. Страхование как экономическая категория 68 KB
  Тема 1. Страхование как экономическая категория 1. Объективная необходимость возникновения отрасли страхования 2.Сущность экономической категории страхования и страховой защиты З.Признаки экономической категории страхования. Принципы страхования Функции ст
17728. Основные понятия и термины страхования 67.5 KB
  Тема 2Основные понятия и термины страхования Страховая терминология. Понятия и термины выражающие наиболее общие условия страхования. Термины связанные с процессом формирования СФ. Термины связанные с расходованием средств СФ. Термины связанные с фу...
17729. Классификация в страховании 48.5 KB
  ТЕМА З.. Классификация в страховании Понятие и основные критерии классификации в страховании Виды и формы страхования Под классификацией понимают иерархическую систему взаимосвязанных звеньев. Классификация страхования представляет собой научную си...