Назва роботи: MySQL + Lazarus: Робота і базою даних з Lazarus. TMySQL50Connection, TSQLTransaction, TSQLQuery - компоненти для роботи з базою даних
Предметна область: Інформатика, кібернетика та програмування
Опис: Створіть порожній проект. В папку проекту необхідно скопіювати бібліотеку DLL для роботи з MySQL. Завантажити її можна тут: libmysql.dll. Додайте на формі компоненти TMySQL50Connection, TSQLTransaction, TSQLQuery з панелі SQLbd; і компонент TDatasource з панелі Data Access.
Розмір файлу: 937.82 KB
Роботу скачали: 99 чол.
Лабораторні роботи з дисципліни «Управління даними»
MySQL + Lazarus: Робота і базою даних з Lazarus
TMySQL50Connection, TSQLTransaction, TSQLQuery # 150; компоненти для роботи з базою даних
Створіть порожній проект. В папку проекту необхідно скопіювати бібліотеку DLL для роботи з MySQL. Завантажити її можна тут: libmysql.dll.
Додайте на формі компоненти TMySQL50Connection, TSQLTransaction, TSQLQuery з панелі SQLbd; і компонент TDatasource з панелі Data Access.
Налаштуйте зв'язку між цими компонентами.
- У властивості Transaction об'єкта MySQL50Connection1 виберіть SQLTransaction1 (я не міняв привласнюються за замовчуванням імена об'єктів).
- У властивості Database об'єкта SQLQuery1 виберіть MySQL50Connection1
- У властивості Transaction об'єкта SQLQuery1 виберіть SQLTransaction1
- У властивості DataSet об'єкта Datasource1 виберіть SQLQuery1
Об'єкти класу TSQLQuery є наборами даних. У нього завантажується копія таблиці з сервера БД, з якою потім і здійснюється вся робота.
Доступ до даних за допомогою запитів
Для виконання запиту потрібно використовувати код:
SQLQuery1.SQL.Add ( 'Select * from ListCatalog;');
Ми спочатку закриваємо набір даних SQLQuery1, викликаючи його метод Close (Аналогічного результату можна домогтися встановивши властивість Active в false). Якщо набір закритий, його зв'язок з базою даних розірвана. Потім ми очищаємо властивість SQL за допомогою методу Clear. За допомогою методу Add записуємо в нього текст нового запиту. Виповнюється запит при виконанні команди Open, яка переводить набір даних SQLQuery1 у відкритий режим і записує в нього результати виконання SQL запиту.
Якщо SQL запит не має на увазі повернення таблиць даних (запити INSERT і UPDATE), необхідно скористатися альтернативним способом його виконання:
SQLQuery1.SQL.Add ( 'INSERT INTO myArtTable (text, description. Keywords)
VALUES ( '+ # 39 + memo3.text + # 39 +', '+ # 39 + memo2.text + # 39 +', '+ # 39 + memo1.text + # 39 +'); ');
При цьому, при спробі перевести набір даних у відкритий режим (виконати SQLQuery1.Open;) виникне помилка. Для її усунення потрібно або записати в властивість SQL новий запит, який повертає таблицю, так показано нижче:
SQLQuery1.SQL.Add ( 'INSERT INTO myArtTable (text, description. Keywords)
VALUES ( '+ # 39 + memo3.text + # 39 +', '+ # 39 + memo2.text + # 39 +', '+ # 39 + memo1.text + # 39 +'); ');
SQLQuery1.SQL.Text: = 'SELECT * from myArtTable;';
Або створити і використовувати для таких SQL запитів окремий набір даних (SQLQuery2), який ніколи не переводити у відкритий режим.
Підключення та відключення від бази даних в Lazarus
Будемо підключатися до віддаленої базі даних не відразу, а після отримання явної команди від користувача (клацання по відповідній кнопці), тому встановимо в інспекторові об'єктів властивість Сonnected компонента TMySQL50Connection і властивості Active компонент TSQLTransaction і TSQLQuery в false.
Створимо на формі кнопку «Підключитися». У обробнику натиснення напишемо.
procedure TForm1.Button1Click (Sender: TObject);
ShowMessage ( 'Не можу підключитися до бази даних');
ShowMessage ( 'Помилка при виконанні SQL запиту.');
Таким чином, спочатку проводиться спроба підключення до MySQL базі, якщо вона пройшла успішно, створюється нова транзакція, після чого при активації об'єкта SQLQuery1 виконується SQL запит до бази даних, яка обирає все рядки з таблиці. Перед тим, як отримати таблицю з сервера, необхідно відповідним чином налаштувати кодування. У моїй базі дані зберігаються в кодуванні cp1251, тому я виконую запит
// SET character _ set _ results = 'cp 866'; / * Встановлює кодування даних відправляються До клієнта * /
// SET character _ set _ client = 'cp 866'; / * Встановлює кодування даних відправляються ВІД клієнта * /
// SET character _ set _ connection = 'utf 8' / * встановлює кодування, в яку перетворюється інформація прийшла від клієнта, перед виконанням запиту на сервері. * /
При відключенні від бази даних діємо в зворотному порядку. Задамо код відключення в обробнику події OnDestroy форми
procedure TForm1.FormDestroy (Sender: TObject);
Навігація за даними
Навігація заснована на роботі візуальних компонент з вкладки «Data Controls». Розмістимо на нашій формі компоненти TDBGrid, TDBNavigator і три компонента TDBMemo. І встановимо в їх властивості DataSource посилання на DataSource1. У властивості DataField об'єктів DBMemo1 запишемо Catalog_name відповідно. (Де Catalog_name # 150; ця назва полів (колонок) в таблиці ListCatalog.)
Запустіть програму і натисніть кнопу «Підключитися ...». Після підключення до бази даних отримана з сервера таблиця буде відображатися в об'єкті DBGrid1. Стрілочкою ліворуч позначена поточна запис. За допомогою кнопок панелі DBNavigator1 можна переміщатися по рядках таблиці. Ви також можете редагувати записи, однак після закриття програми всі зроблені зміни скинуться. Для їх збереження в базу необхідно викликати метод ApplyUpdates:
методи класу TSQLQuery, призначені для навігації по базі:
- TSQLQuery.Next # 150; перейти на запис вперед
- TSQLQuery.Prior # 150; перейти на запис назад
- TSQLQuery.First # 150; перейти на перший запис
- TSQLQuery.Last # 150; перейти на останній запис
- TSQLQuery.Insert # 150; додати новий запис
- TSQLQuery.Delete # 150; видалити запис
- TSQLQuery.Edit # 150; перевести набір даних в режим редагування
- TSQLQuery.Post # 150; зберегти зроблені зміни в набір даних
- TSQLQuery.Refresh # 150; оновити таблицю
Для того щоб отримати значення якого-небудь поля записи, можна скористатися методом FieldByName (fn: string), де fn # 150; назва поля (колонки) таблиці. Цей же метод можна використовувати для запису нових даних в таблицю. Формат читання / запису вказується за допомогою властивостей AsString, AsInteger, AsFloat, AsDataTime, ... Наприклад, щоб записати поточний значення поля id в Label, можна скористатися кодом:
Наведемо також приклад редагування поточного рядка таблиці
SQLQuery1.FieldByName (# 145; keywords # 146;). AsString: = # 146; Lazarus жжот # 146 ;;
SQLQuery1.FieldByName (# 145; text # 146;). AsString: = # 146; новий текст # 146 ;;
Варто зазначити, що не кожен набір даних можна редагувати навігаційним способом. Щоб отримати в результаті SQL запиту редагований набір (тобто такий, що внесені зміни можна було зберегти в базу даних), необхідне виконання наступних умов:
- дані відбираються тільки з однієї таблиці;
- таблиця допускає модифікацію;
- в запиті не використовується DISTINCT і статичні функції;
- в запиті не застосовуються з'єднання таблиць;
- в запиті відсутні підзапити і вкладені запити;
- не використовується групування даних;
- сортування застосовується тільки до індексних полів;
Використання транзакцій і TSQLTransaction в Lazarus
Взагалі механізм транзакції необхідний для збереження цілісності бази даних. Припустимо, для внесення актуальних даних в базу Вам необхідно записати в різні таблиці велика кількість інформації. Якщо в процесі запису вимкнеться електрику, то частина таблиць будуть містити актуальну інформацію, а частина стару. В результаті база даних виявиться зіпсованою. Уникнути цього дозволяє механізм транзакцій. Якщо всі операції запису завершилися успішно, транзакція вважається успішною і всі зміни в таблицях бази вважаються підтвердженими. Якщо ж хоча б одна операція записи не виконано, транзакція вважається невдалою і таблиці бази даних повертаються до стану, який вони мали до початку транзакції.
Для роботи з транзакціями в Lazarus доданий компонент TSQLTransaction. Однак, в даний час він не працює з MySQL базами даних. TSQLTransaction автоматично переходить в активний стан при відкритті набору даних (TSQLQuery) і закривається при його закритті. Для явного підтвердження успішності транзакції можна використовувати метод TSQLTransaction.Commit. Викликати його слід відразу після TSQLQuerty.ApplyUpdates; Для відкату транзакції можна використовувати метод TSQLTransaction.Rollback.