71187

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

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

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

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

Русский

2014-11-03

937.82 KB

87 чел.

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

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


 

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

77267. Сегмент спинного мозга 56.3 KB
  Заднекорешковые волокна Вставочные рассеянные клетки spongios et terminlis 12 выше и нижележащие geltinos 37 выше и ниже Задние латеральные передние собственные пучки ДЯПРСМ.
77268. Канатики спинного мозга. Восходящие и нисходящие проводники спинного мозга 105.58 KB
  Задний канатик афферентные пути: fsciculus grcilis Голля центральные отростки псевдоуниполярных клеток 19 нижних спинномозговых узлов сознательная проприоцептивная и частично тактильная чувствительность от нижних конечностей и нижней части туловища fsciculus cunetus Бурдаха 12 верхних от рецепторов мышц верхних конечностей шеи и верхней части туловища fsciculus proprius posterior аксоны вставочных нейронов сегментарного аппарата zon rdiculris горизонтальные нервные волокна центральные отростки псевдоуниполярных клеток...
77269. Оболочки и межоболочечные пространства спинного мозга. Содержимое этих пространств. Фиксирующий аппарат спинного мозга 13.58 KB
  От латеральной части отходят ligment denticult во фронтальной плоскости в форме зубцов верхушки которых охватываются отростками паутинной оболочки и заканчиваются на внутренней поверхности твёрдой посередине между двумя СМН rchnoide mter spinlis паутинная оболочка прозрачная плёнка переходит в паутинную оболочку головного мозга в области formen mgnum; на уровне SII сливается с мягкой оболочкой. Её отростки образуют влагалища для пронизывающих её корешков СМН и зубчатых связок. От боковой поверхности отходят отростки в виде рукавов для...
77270. Продолговатый мозг, его развитие, внешнее и внутреннее строение (ядра, проводники), артерии продолговатого мозга 385.3 KB
  Серое вещество: 4 группы ядер nuclei grcilis et cunetus; nuclei olive; nuclei formtion reticulris; ядра IXXII пар черепных нервов Черепные нервы продолговатого мозга: nn hypoglossus XII пара ccessories XI пара vgus X пара glossophryngeus IX пара.
77271. Мост, его развитие, внешнее и внутреннее строение (ядра и проводники). Артерии моста 147.51 KB
  Артерии моста. Внутреннее строение: На поперечном срезе можно выделить основание моста базилярную часть вентральную часть prs bsilris ventrlis; покрышку моста tegmentum pontis дорсальную часть prs dorslis и трапециевидное тело corpus trpezoideum Серое вещество: nuclei proprii pontis; nuclei formtion reticulris; nuclei nterior et posterior corporis trpezoideum; ядра VVIII пар черепных нервов. Черепные нервы моста n. Белое вещество: В базальной части основании моста проходят: tr.
77272. Мозжечок, его развитие, внешнее и внутреннее строение. Связи мозжечка с др отделами центральной нервной системы. Артерии мозжечка 232.24 KB
  Части: Средняя vermis Боковые hemispheri Поверхности: Fcies superior cerebelli посередине продольное возвышение vermis superior Fcies inferior cerebelli посередине продольное возвышение vermis inferior продольное углубление долина мозжечка vllecul cerebelli. Дольки червя: lingul cerebelli lobulus centrlis monticulus culmen declive folium cerebelli tuber vermis pyrmis vermis uvul vermis nodulus. Дольки полушарий: lobulus qudrngulris lobulus semilunris superior et inferior lobulus grcilis lobulus biventer tonsill...
77273. Спинно-мозжечковые пути 14.9 KB
  spinocerebellris posterior Идет в составе нижних ножек мозжечка. Заканчиваются на нейронах коры нижней части червя мозжечка.spinocerebellris nterior Идет в составе верхних ножек мозжечка. Заканчиваются на нейронах коры верхней части червя мозжечка.
77274. Средний мозг, его развитие, внешнее и внутреннее строение (отделы, ядра, тракты, полость) 120.39 KB
  Внутреннее строение: Серое вещество: substnti nigr чёрное вещество Земмеринга разграничивает bsis pedunculi cerebri вентральнее и tegmentum mesencephli дорсальнее содержит серое и белое вещество ножек мозга nucleus ruber на нём заканчиваются tr. striorubrlis nucleus interpedunculris межножковое непарное на нём заканчивается tr. hbenulointerpedunculris поводковомежножковый путь предположительно одно из звеньев эфферентного вегетативного пути substnti grise centrlis: nucl. trigemini V ядра III nucl.
77275. Промежуточный мозг, его развитие, классификация, отделы и полость. Стенки полости 445.42 KB
  Таламический мозг: Thlmus Epithlmus Metthlmus Внешнее строение таламуса зрительного бугра: tuberculum nterius pulvinr задний конец подушка stri terminlis терминальная полоска разделяет thlmus зрительный бугор и хвостатое ядро nucleus cudtus stri medullris мозговая полоска проходит на границе верхней и медиальной поверхностей зрительного бугра sulcus hypothlmicus sulcus limitns пограничная борозда граница между отделами промежуточного мозга dhesio interthlmic соединяет зрительные бугры tel choroide сосудистая...