Mysql lazarus робота і базою даної на web сервері з 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

Об'єкти класу 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». Розмістимо на нашій формі компоненти TDBGrid, TDBNavigator і три компонента TDBMemo. І встановимо в їх властивості DataSource посилання на DataSource1. У властивості DataField об'єктів DBMemo1, DBMemo2, DBMemo3 запишемо description, text і keywords відповідно. (Нагадую, що description, text і keywords - це назва полів (колонок) в таблиці myArtTable.) Оскільки наш набір даних спочатку знаходиться в закритому стані (Action = false), Lazarus буде видавати попередження при спробі введення назв полів. Не звертайте уваги - це нормально.

Mysql lazarus робота і базою даної на web сервері з lazarus

Запустіть програму і натисніть кнопу «Підключитися ...». Після підключення до бази даних отримана з сервера таблиця буде відображатися в об'єкті 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. Механізм роботи з іншими базами даних в цілому не відрізняється від описаного тут.

SQL запит для створення таблиці myArtTable