71187

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

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

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

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

Русский

2014-11-03

937.82 KB

83 чел.

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

Лабораторной работе №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.


 

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

13790. А.И. СОЛОВЬЕВ ПОЛИТОЛОГИЯ, ПОЛИТИЧЕСКАЯ ТЕОРИЯ, ПОЛИТИЧЕСКИЕ ТЕХНОЛОГИИ 3.41 MB
  А.И. СОЛОВЬЕВ политология ПОЛИТИЧЕСКАЯ ТЕОРИЯ ПОЛИТИЧЕСКИЕ ТЕХНОЛОГИИ В данном издании освещаются важнейшие проблемы политической науки традиционно включаемые в фундаментальные курсы зарубежных и отечественных университетов. Наряду с этим в книге раскрывают...
13791. Экономика Общий курс 3.32 MB
  Экономика Общий курс Учебник Фундаментальной теории экономики по дисциплинам: экономика введение основы общая теория рыночная экономика экономическая теория теоретическая экономика политэкономия микроэкономика макроэкономика Войтов А. Г. Э...
13792. Обществознание на «отлично»: основные понятия, персоналии, образцы эссе 673 KB
  Обществознание на отлично: основные понятия персоналии образцы эссе Справочнометодическое пособие для выпускников школ и преподавателей Волкова Т.И. Заслуженный учитель республики Хакасии Почетный работник общего образования РФ Предлагаемое уч...
13793. Обществознание в таблицах 1.09 MB
  Тема 1 Обществознание. Обществознание – это сводный учебный курс содержащий основные выводы современных наук об обществе о законах его развития о человеке. Система наук об обществе: Социальная философия Частные социальн...
13794. Метод найменших квадратів 27.64 KB
  Метод найменших квадратів 1. Розглянемо однофакторну модель: y=b0b1x1. Якщо б не було похибки викликаної через дві причини: похибка експерименту; неадекватність моделі. То було б справедливо: yib0bixi≡0 2.На практиці: нев’язка. 3.Використов...
13796. Ортогональное разложение матриц и его применения 4.29 MB
  Пояснительная записка к курсовому проекту по дисциплине Методы численного анализа на тему Ортогональное разложение матриц и его применения Оглавление Оглавление Теоретические сведения Преобразование Хаусхол...
13797. Сингулярное правопреемство и легаты 21.97 KB
  Сингулярное правопреемство и легаты Наряду с назначением наследника в завещании могли содержаться отказы: распоряжения о выдаче наследником известных сумм или вещей определенным лицам о выполнении наследником определенных действий в пользу третьих лиц. Таким образо
13798. СИНГУЛЯРНЫЕ ТЕРМЫ 210 KB
  Вендлер СИНГУЛЯРНЫЕ ТЕРМЫ 1. Аналитическая философия издавна стремилась постигнуть природу сингулярных термов а теорию дескрипций часто называют наивысшим ее достижением. Поскольку мы не раз читали Б. Рассела У. Куайна П. Гича П. Стросона и других философов которые у...