71187

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

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

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

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

Русский

2014-11-03

937.82 KB

71 чел.

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

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


 

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

7757. Процесс обучения как целостная система 117 KB
  Процесс обучения как целостная система. Двусторонний характер процесса обучения. Процесс обучения является разновидностью человеческой деятельности, которая носит двусторонний характер. Этот процесс обязательно предполагает взаимодействие преподав...
7758. Научные основы содержания образования в современной школе 62 KB
  Научные основы содержания образования в современной школе. Понятие содержания образования, его сущность. Концепция содержания образования по И.Я. Лернеру, В.В. Краевскому, М.Н. Скаткину. Обучение - это социально обусловленный процесс, вызванный...
7759. Методы обучения. Понятие и сущность метода, приема и средств обучения 230 KB
  Методы обучения 1. Понятие и сущность метода, приема и средств обучения Метод (в переводе с греческого языка означает буквально путь к чему-либо) обозначает способ деятельности, направленной на достижение определённой цели. В педагогической ли...
7760. Формы организации и средства обучения 149 KB
  Формы организации и средства обучения. 1. Понятие о формах организации обучения и сущность способов и систем обучения, видов учебной деятельности ученика, форм организации текущей учебной работы учащихся Понятие метод обучения, сущность которого р...
7761. Педагогические технологии в образовательном процессе 76 KB
  Педагогические технологии в образовательном процессе. Из истории становления понятия педагогической технологии Технология (от греч. techne - искусство, мастерство, ремесло, умение и logos - учение, наука) - совокупность методов обра...
7762. Сущность проблемного обучения 72.5 KB
  Сущность проблемного обучения. Определение сущности проблемного обучения. Его основные понятия. Одним из перспективных направлений активизации учебной деятельности учащихся, развития у них познавательных интересов, творческих способностей самостоят...
7763. Дидактическая система развивающего обучения 63 KB
  Дидактическая система развивающего обучения. Из истории становления развивающего обучения Развивающее обучение - это ориентация учебного процесса на потенциальные возможности учащегося и их реализацию. Теория развивающего обучения берет...
7764. Сущность личностно-ориентированного образования школьников 59.76 KB
  Сущность личностно-ориентированного образования школьников. Сущность личностно-ориентированного образования в школе (определение, цель, принципы) Определение. Личностно-ориентированный образовательный процесс представляет собой не аккумуляти...
7765. Теория и практика воспитания детей и учащейся молодежи 135.5 KB
  Теория и практика воспитания детей и учащейся молодежи. Теоретические основы воспитания: закономерности, цели, принципы. В условиях социальных преобразований в обществе к человеку предъявляются требования активности, мобильности, готовности жить...