МІНІСТЕРСТВО ОСВІТИ І НАУКИ p>
РЕСПУБЛІКА КАЗАХСТАН p>
ІНСТИТУТ «ЖЕТЫСУ» p>
КАФЕДРА ФІНАНСОВО-ЕКОНОМІЧНИХ ДИСЦИПЛІН p>
Юнусов Рінат Ісе 410А p>
Компоненти для роботи з базами даних: p>
TTable і TQuery p>
(курсова робота) p>
Науковий керівник: p> < p> Шлембаев К.Т. p>
Талдикорган 2003 p>
Зміст: p>
| 1. Введення ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .. | 2 |
| 2. Компоненти для роботи з БД середовища Delphi 6 ... ... ... ... ... ... ... ... ..... | 2 |
| 3. Набори даних ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... | 3 |
| | |
| 3.1 Основні прийоми роботи з TDataSet ... ... ... ... ... ... ... ... ... ... ... ... ... ... | 4 |
| | |
| 3.2 Основні властивості, методи і події TDataSet ... ... ... ... ... ... ... .. | 7 |
| 4. Огляд компонента TTable ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .. | 10 |
| 5. Огляд компонента TQuery ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .... | 11 |
| 6. Порівняння компонентів TTable і TQuery ... ... ... ... ... ... ... ... ... ... ... | 15 |
| 7. Висновок ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... .. | 17 |
| 8. Додаток ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... | 18 |
| Список використаної літератури. ... ... ... ... ... ... ... ... ... ... ... ... ... ... | 21 | p>
1. Введення p>
Базами даних (БД) називають електронні сховища інформації, доступ доякими здійснюється за допомогою одного або декількох комп'ютерів. Зазвичай
БД створюється для зберігання і доступу до даних, що містить відомості продеякої предметної області, тобто деякої області людськоїдіяльності або області реального світу. p>
Системи управління базами даних (СУБД) - це програмні засоби,призначені для створення, наповнення, оновлення та видалення баз даних. p>
За своєю архітектурою СУБД поділяються на автономні, файл - серверні,клієнт - серверні і багатоланкові. У цій роботі будерозглядатися робота тільки з автономними СУБД. p>
Автономні БД є найбільш простими. Вони зберігають свої дані влокальній файловій системі на тому комп'ютері, на якому встановленісистема керування і машина баз даних, що здійснює до них доступ,перебуває на тому ж самому комп'ютері. Мережа не використовується. P>
Автономні бази даних корисні для розвитку тих програм, якіпоширені серед багатьох користувачів, кожен з яких підтримуєокрему базу даних. Це, наприклад, додатки, що обробляютьдокументацію невеликого офісу, кадровий склад невеликого підприємства,бухгалтерські документи. Кожен користувач такого додатка маніпулюєсвоїми власними даними на своєму комп'ютері. Користувачеві немаєнеобхідності мати доступ до даних будь-якого іншого користувача, так щоокрема БД тут цілком прийнятна. p>
У цій роботі буде наведено приклад програми працює завтономними БД - "Довідник співробітника ДІБДР", Додаток було розробленоавтором в середовищі Delphi 6. p>
2. Компоненти для роботи з БД середовища Delphi 6 p>
Кожна програма, що використовує бази даних, зазвичай має по крайнеймірою по одному компоненту наступних типів:
. Компоненти - набори даних (Data set), безпосередньо зв'язуються з базою даних. Для BDE це такі компоненти, як Table, Query, Stored p>
Proc, BDEClientDataSet. Для інших технологій є аналогічні компоненти наборів даних.
. Компонент - джерело даних (Data source), що здійснює обмін інформацією між компонентами першого типу і компонентами візуалізації та керування даними. Таким компонентом є DataSource.
. Компоненти візуалізації даних і керування даними, такі, як DBGrid, p>
DBTExt, DBEdit і безліч інших. P>
Зв'язок цих компонентів один з одним і з базою даних можна представитисхемою наведеною нижче: p>
Схема взаємодії компонентів Delphi з базою даних p>
3. Набори даних p>
Під набором даних (НД) розуміється група записів з однієї абодекількох таблиць БД, доступна для компонентів-наборів TTable, TQuery або
TStoredProc. Ці компоненти породжені від загального батьківського класу
TDBDataSet і успадковують всі його властивості, методи і події. P>
Клас TDataSet p>
TDataSet клас - одна з найбільш важливих об'єктів БД. Щобпочати працювати з ним, треба поглянути на наступну ієрархію: p>
TDataSet p>
| p>
TDBDataSet p>
| p>
| - TTable p>
| - TQuery p>
| - TStoredProc p>
TDataSet містить абстрактні методи там, де має бутибезпосереднє управління даними. TDBDataSet знає, як поводитися зпаролями і те, що потрібно зробити, щоб підключитися до певноїтаблиці. TTable знає (тобто вже все абстрактні методи переписані), якзвертатися з таблицею, її індексами і т.д. p>
TDataSet - інструмент, який використовується наприклад для відкриттятаблиці, і переміщення по ній. Звичайно, не потрібно безпосередньо створюватиоб'єкт типу TDataSet. Замість цього, потрібно використовувати TTable, TQuery абоінших нащадків TDataSet (наприклад, TQBE). На найбільш фундаментальномурівні, Dataset це просто набір записів, як зображено на рис.1 p>
Рис.1: Будь-який dataset складається з ряду записів (кожна містить N полів) івказівник на поточний запис. p>
У більшості випадків DataSet буде мати пряме, один до одного,відповідність з фізичної таблицею, яка існує на диску. Однак, вінших випадках можна виконувати запит або деякі інші дії, які повертаютьdataset, який містить або будь-яке підмножина записів однієї таблиці,, або об'єднання (join) між кількома таблицями. p>
3.1 Основні прийоми роботи з TDataSet p>
Відкриття та закриття DataSet p>
Є два різні способи відкрити таблицю під час виконанняпрограми. Можна написати наступний рядок коду: p>
Table1.Open; p>
Або можна встановити властивість Active рівне True: p>
Table1.Active: = True; p>
Немає ніякого розходження між результатом вироблених цими двомаопераціями. Метод Open, проте, сам закінчується установкою властивості
Active в True, так що може бути навіть трохи більш ефективно використовувативластивість Active напряму. p>
Також, як є два способи відкрити a таблицю, так і є два способизакрити її. Найпростіший спосіб просто викликати Close: p>
Table1.Close; p>
Або можна написати: Table1.Active: = False; p>
Навігація (Переміщення по записах)
Великий набір методів і властивості TDataSet забезпечує все, що потрібнодля доступу до будь-якої конкретної запису всередині таблиці: p>
Огляд їх функціональних можливостей описаний нижче в таблиці методівкласу TDadaSet. p>
TDataSet.BOF - read-only Boolean властивість, що використовується для перевірки,чи знаходиться курсор на початку таблиці. Властивості BOF повертає true у трьохвипадках:
Після того, як файл був відкритий;
Після того, як зголосився метод TDataSet.First;
Після того, як не виконався виклик методу TDataSet.Prior. P>
Перші два пункти - очевидні. Коли відкривається таблиця, Delphi поміщаєкурсор на перший запис; коли викликається метод First, Delphi такожпереміщує курсор у початок таблиці. Третій пункт, однак, вимагаєневеликого пояснення: після того, як викликався метод Prior кілька разів,курсор міг дістатися до початку таблиці, і наступний виклик Prior буденевдалим - після цього BOF і буде повертати True. p>
Наступний код показує самий загальний приклад використання Prior, коликурсор потрапляє до першого запису: while not Table.Bof do p>
Table1.Prior; end; p>
Цикл триватиме до тих пір, поки виклик Table1.Prior не зможебільше переміщати курсор на попередній запис у таблиці. У цей момент BOFповерне True і програма вийде з циклу. p>
Все сказане щодо BOF також можна застосувати і до EOF. Іншимисловами, код, наведений нижче показує простий спосіб пробігти по всіхзаписам у a dataset: p>
Table1.First; while not Table1.EOF do p>
Table1.Next; end; p>
EOF повертає True в наступних трьох випадках:
Після того, як файл був відкритий;;
Після того, як зголосився метод TDataSet.Last;
Після того, як не виконався виклик методу TDataSet.Next p>
Єдина навігаційна процедура, яка ще не згадувалася -
MoveBy, яка дозволяє переміститися на N записів вперед або назад втаблиці. Якщо необхідно переміститися на два записи вперед, то сліднаписати наступний оператор: p>
MoveBy (2); або p>
MoveBy (-2); p>
Prior і Next - це прості функції, які викликають MoveBy.
При використанні цієї функції необхідно завжди пам'ятати, що DataSet --це змінюються об'єкти, і запис, яка була п'ятою за рахунком впопередній момент, тепер може бути четвертої або шостої або взагалі можебути видалена ... p>
Поля p>
У більшості випадків, коли потрібно отримати доступ з програми доіндивідуальні полям запису, можна використовувати одну з таких властивостейабо методів, кожен з яких належать TDataSet: p>
property Fields [Index: Integer]; function FieldByName (const FieldName: string): TField; property FieldCount; p>
Властивість FieldCount повертає кількість полів в поточній структурі запису.
Якщо необхідно програмним шляхом прочитати імена полів, то використовуєтьсявластивість Fields для доступу до них: p>
var p>
S: String; begin p>
S: = Fields [0]. FieldName; end; p>
Коротше кажучи, індекс Інформація передається в Fields (що починається з нуля), івизначає номер поля до якого Ви отримаєте доступ, тобто перше поле --нуль, друга один, і так далі. p>
Якщо Ви хочете прочитати поточне утримання конкретного поля конкретноїзапису, то використовується властивість Fields або метод FieldsByName. Для того,щоб знайти значення першого поля запису, прочитайте перший елемент масиву
Fields: p>
S: = Fields [0]. AsString; p>
Припустимо, що перше поле в записі містить номер замовника, тодікод, показаний вище, повернув би рядок типу "1021", "1031" або "2058".
Якщо потрібно отримати доступ до цей змінний, як до числової величини,тоді треба використовувати AsInteger замість AsString. Аналогічно, властивість
Fields включають AsBoolean, AsFloat і AsDate. P>
Можна використовувати функцію FieldsByName замість властивості Fields: p>
S: = FieldsByName ( 'CustNo'). AsString; p>
Як показано у прикладах вище, і FieldsByName, і Fields повертають ті жсамі дані. Два різні синтаксису використовуються виключно для того,щоб забезпечити програмістів гнучким і зручним набором інструментів дляпрограмного доступу до вмісту DataSet. p>
Властивість Fields дозволяє вибрати тип результату Ось список доступнихметодів який можна знайти в описі класу TField: property AsBoolean property AsFloat property AsInteger property AsString property AsDateTime p>
Всякий раз (коли це має сенс), Delphi зможе зробитиперетворення. Наприклад, Delphi може перетворювати поле Boolean до
Integer або Float, або поле Integer до String. Але не буде перетворювати
String до Integer, хоча і може перетворювати Float до Integer. P>
Основні властивості, методи і події НД p>
Властивості p>
| Властивість | Опис |
| property Active: Boolean; | Відкриває/закриває НД |
| property AutoCalcFields: Boolean; | Дозволяє/забороняє виникнення |
| | Події OnCalcFields |
| Type TBookmarksStr: String; | Визначає закладку на поточного запису. |
| property BookMark: TBookMarkStr; | До поміченої записи можна швидко |
| | Перейти методом GotoBookMark |
| property CanModify: Boolean; | Вказує, чи може користувач |
| | Змінювати НД |
| property Database: TDatabase; | Визначає компонент TDatabase, |
| | Пов'язаний з даними НД |
| property DatabaseName: String; | Містить псевдонім бази даних |
| property DataSource: TDataSource; | Використовується в нащадках для вказівки |
| | Детального НД, у зв'язку один до багатьох |
| property EOF: Boolean; | Містить True, якщо курсор НД змістився |
| | За останній запис |
| property FieldCount: Integer; | Містить кількість полів в НД |
| property Fields: TFields; | Дозволяє звернутися до полів за їх |
| | Індексу. Перше поле НД має індекс 0 |
| property FieldValues [const FieldName: | Дозволяє звернутися до значень полів |
| String]: Variant; | на ім'я поля |
| property Filter: String; | Визначає фільтруюче вираз |
| property Filtered: Boolean; | Дозволяє/забороняє фільтрацію записів |
| | НД |
| type TFilterOption = | Визначає умови фільтрації в |
| (foCaseInsensitive, | текстових полях: foCaseInsensitive |
| foNoPartialCompare); TFilterOptions = |-враховувати регістр букв; |
| set of TFilterOption; | foNoPartialCompare - пошук на точне |
| | Відповідність зразком |
| property Modifed: Boolean; | Містить True, якщо поточна запис НД |
| | Була змінена |
| property RecNo: LongInt; | Визначає номер поточного запису |
| property RecordCount: LongInt; | Містить кількість записів у поточному |
| | НД |
| type TDataSetState = (dsInactive, | Вказує стан НД: |
| dsBrowse, dsEdit, dsInsert, dsSetKey, | dsInactive-закритий, dsBrowse-перегляд, |
| dsCalcFields, dsFilter, dsNewValue, | dsEdit-редагування, |
| dsOldValue, dsCurValue, dsBlockRead, | dsInsert-вставка, dsSetKey-пошук |
| dsInternalCalc) | записи, dsCalcFields-встановлення |
| | Обчислюваних полів, dsFilter-фільтрація |
| | Записів, dsNewValue-оновлення, |
| | DsOldValue-оновлення, |
| | DsCurValue-оновлення, |
| property State: TDataSetState; | dsBlockRead-читання блоку записів, |
| | DsInternalCalc-оновлення | p>
Методи: p>
| procedure Append; | Додає порожню запис у кінець НД |
| procedure AppendRecord (const Values: | Додає нову запис, заповнює її |
| Array of const); | поля значеннями Values та надсилає її в |
| | БД |
| procedure ApplyUpdates; | Записує кеш оновлення в таблиці БД |
| procedure Cancel; | Відміняє всі зміни поточного запису, |
| | Які не були збережені в БД |
| procedure CancelUpdates; | Очищає кеш оновлення |
| procedure CheckBrowseMode; | Якщо НД перебував у стані |
| | Редагування або вставки, викликає |
| | Метод Post для запису змін в БД |
| procedure ClearFields; | Очищає всі поля поточного запису |
| procedure Close; | Закриває НД |
| procedure | Закриває базу даних Database |
| CloseDatabase (Database: TDatabase); | |
| procedure CommitUpdates; | Очищає кеш після успішного оновлення |
| | Даних у БД |
| function ControlsDisabled: Boolean; | Повертає True, якщо показ даних у |
| | Візуальних компонентах тимчасово |
| | Заборонено методом DisableControls |
| procedure Delete; | Видаляє поточний запис |
| function DisableControls; | З метою поліпшення продуктивності |
| | При навігації по НД тимчасово забороняє |
| | Зміну даних у візуальних компонентах |
| procedure Edit; | Редагує поточну запис |
| procedure EnableCointrols; | Відміняє дію методу |
| | DisableControls |
| function FieldByName (const FieldName: | Забезпечує доступ до поля по його імені |
| String): TField; | FieldName |
| function FindField (const FieldName: | Шукає поле FieldName в НД і повертає |
| String): TField; | посилання на полі або NIL, якщо поле не |
| | Знайдено |
| function FindFirst: Boolean; | Намагається встановити курсор на першому |
| | Запис НД і повертає True у випадку |
| | Успіху |
| function FindLast: Boolean; | Намагається встановити курсор на останню |
| | Запис НД і повертає True у випадку |
| | Успіху |
| function FindNext: Boolean; | Намагається встановити курсор на наступну |
| | Запис НД і повертає True у випадку |
| | Успіху |
| function FindPrior: Boolean; | Намагається встановити курсор на |
| | Попередній запис НД і повертає True |
| | У разі успіху |
| function First: Boolean; | Встановлює курсор на перший запис у |
| | НД |
| procedure FreeBookMark (BookMark: | Звільняє пам'ять пов'язану з |
| TBookMark); virtual; | закладкою BookMark |
| function GetBookMark: TBookMark; | Створює закладку на поточного запису і |
| virtual; | повертає вказівник на неї |
| procedure GotoBookMark (BookMark: | Забезпечує повернення до запису, |
| TBookMark); | пов'язаної із закладкою BookMark |
| procedure Insert; | Переводить НД в режим вставки записів |
| procedure InsertRecord (const Values: | Створює порожню запис, наповнює її |
| array of const); | поля значеннями Values і вставляє її в |
| | НД |
| function isEmpty: Boolean; | Повертає True, якщо в НД немає записів |
| procedure Last; | Встановлює курсор на останню |
| | Запис |
| function Locate (const KeyFields: | Шукає в полях перерахованих у параметрі |
| String; const KeyValues: Variant; | KeyFields, значення, вказані в |
| Options: TLocateOptions): Boolean; | KeyValues за умов, заданих |
| | Параметром Options. Якщо запис |
| | Знайдено, робить її поточної і повертає |
| | True |
| function LookUp (const KeyFields: | Використовується в детальних НД для пошуку |
| String; const KeyValues: Variant; | у полях KeyFields значень KeyValues. |
| const ResultFields: String): Variant; | При успіху повертає значення полів |
| | ResultFields |
| function MoveBy (Distance: | Переміщає курсор на Distance записів |
| Integer): Integer; | вгору або вниз щодо поточної |
| | Запису |
| procedure Next; | Переміщає курсор до наступної записи |
| procedure Open; | Відкриває НД |
| procedure Post; virtual; | Зберігає вставлену або |
| | Відредаговану запис в таблиці БД |
| procedure Prior; | Переміщає курсор до попереднього запису |
| procedure Refresh; | Оновлює НД даними з БД |
| procedure SetFields (const Values: | Встановлює значення Values в усі |
| array of const); | поля поточного запису | p>
Події: p>
| type TDataSetNotifyEvent = procedure | |
| (DataSet: TDataSet) of object | |
| property AfterCancel: | Виникає відразу після скасування змін до |
| TDataSetNotifyEvent; | поточного запису |
| property AfterClose: | Виникає відразу після закриття НД |
| TDataSetNotifyEvent; | |
| property AfterDelete: | Виникає відразу після видалення поточної |
| TDataSetNotifyEvent; | записи |
| property AfterEdit: | Виникає відразу після переходу НД в режим |
| TDataSetNotifyEvent; | редагування |
| property AfterInsert: | Виникає відразу після вставки записи |
| TDataSetNotifyEvent; | |
| property AfterOpen: | Виникає відразу після відкриття НД |
| TDataSetNotifyEvent; | |
| property AfterPost: | Виникає відразу після виконання методу |
| TDataSetNotifyEvent; | Post |
| property AfterScroll: | Виникає відразу після переходу до іншої |
| TDataSetNotifyEvent; | записи |
| property BeforeCancel: | Виникає безпосередньо перед скасуванням |
| TDataSetNotifyEvent; | змін до поточного запису |
| | Виникає безпосередньо перед закриттям |
| property BeforeClose: | НД |
| TDataSetNotifyEvent; | |
| property BeforeDelete: | Виникає безпосередньо перед видаленням |
| TDataSetNotifyEvent; | поточного запису |
| property BeforeEdit: | Виникає безпосередньо перед переходом |
| TDataSetNotifyEvent; | НД в режим редагування |
| property BeforeInsert: | Виникає безпосередньо перед в режим |
| TDataSetNotifyEvent; | вставки |
| property BeforeOpen: | Виникає безпосередньо перед відкриттям |
| TDataSetNotifyEvent; | НД |
| property BeforePost: | Виникає безпосередньо перед |
| TDataSetNotifyEvent; | виконанням методу Post |
| property BeforeScroll: | Виникає безпосередньо перед до нової |
| TDataSetNotifyEvent; | записи |
| property OnCalcFields: | Виникає при не?? бходімості |
| TDataSetNotifyEvent; | перевизначення обчислюваних полів | p>
4. Огляд компонента TTable p>
Так як компонент TTable є спадкоємцем класу TDataSet, вінмає всі його властивості, методи і події. Він використовується для організаціїтаблицями БД. p>
Наступні методи дозволяють змінювати дані, пов'язані з TTable: p>
procedure Append; procedure Insert; procedure Cancel; procedure Delete; procedure Edit; procedure Post; p> < p> Всі ці методи - частина TDataSet, вони успадковані і використовуються TTableі TQuery. p>
Кожного разу, коли потрібно змінити дані, необхідно спочатку перевести
DataSet в режим редагування або вставки. P>
Є типова послідовність, яку можна було б використовувати призміні поля поточного запису: p>
Table1.Edit; p>
Table1.FieldByName ( 'CustName'). AsString: = 'Fred'; p>
Table1.Post; p>
Перший рядок переводить БД в режим редагування. Наступний рядокприсвоює значення 'Fred' полю 'CustName'. Нарешті, дані записуютьсяна диск, коли викликається Post. p>
При використанні такого підходу, Ви завжди працюєте з записами. Самфакт переміщення до наступного запису автоматично зберігає дані на диск.
Наприклад, наступний код буде мати той самий ефект, що і кодпоказаний вище, плюс цьому буде переміщати курсор на наступний запис: p>
Table1.Edit; p>
Table1.FieldByName ( 'CustNo'). AsInteger: = 1234; p>
Table1.Next; p>
Загальне правило, якому потрібно слідувати - щоразу, коли курсорзсувається з поточного запису, введені дані будуть записані автоматично.
Це означає, що виклики First, Next, Prior і Last завжди виконують Post.
Можете скасувати результати редагування в будь-який час, до тих пір, покине викликали прямо або побічно метод Post. Наприклад, якщо НД переведений врежим редагування, і дані були змінені в одному або більше полів,завжди можна повернути запис у вихідний стан викликом методу Cancel. p>
Існують два методи, Append і Insert, що використовуються придодавання нового запису в DataSet. Очевидно має більше сенсувикористовувати Append для DataSets які не індексовані, але Delphi небуде генерувати exception якщо використовується Append на індексованоїтаблиці. Фактично, завжди можна використовувати і Append, і Insert. P>
Приклад додавання запису: p>
begin p>
Table1.Insert; p>
Table1. FieldByName ( 'Name'). AsString: = 'Іван'; p>
Table1.FieldByName ( 'Fam'). AsString: = 'Сидоров'; p>
Table1.Post; end; p>
Видалення запису: Table1.Delete; p>
Процедура показана тут спочатку переводить таблицю в режим вставки
(новий запис з порожніми полями вставляється в поточну позиціюdataset). Після вставки порожній запису, наступним етапом потрібно призначитизначення одному або більшій кількості полів. Існує, звичайно,кілька різних шляхів привласнити ці значення. У програмі можна простоввести інформацію в нову запис через DBGrid. Або розмістити на формістандартну рядок введення (TEdit) та встановити її кожне поле рівнимзначенням, яке користувач надрукував у цьому рядку: p>
Table1.FieldByName ( 'Name'). AsString: = Edit1.Text; p>
Можна використовувати компоненти, спеціально призначені для роботи зданими в DataSet, наприклад DBEdit, DBLabel і т.д. p>
5. Огляд компонента TQuery p>
Скорочення SQL означає Structured Query Language - Мова
Структурованих Запитів, і звичайно вимовлятися або як "Sequel" або
"Ess Qu El". SQL - це потужна мова БД, який легко доступний з Delphi,але який відрізняється від рідної мови Delphi. Delphi може використовуватизатвердження SQL для перегляду таблиць, виконувати об'єднання таблиць,створювати відносини один-ко-багатьом, або виконати майже будь-яка дія,що можуть зробити основні інструменти БД. p>
1. Більшість серверів можуть обробляти SQL запити дуже швидко, а це означає, що використовуючи SQL для віддалених даних, відповідь буде отримана дуже швидко.
1. Є можливість складати SQL запити, які змусять сервер виконати спеціалізовані завдання, недоступні через рідну мову p>
Delphi. P>
SQL запит можна створити використовуючи компонент TQuery в такий спосіб: p>
1. Призначити Псевдонім (Alias) DatabaseName.
1. Використовуючи властивість SQL щоб ввести SQL запит типу p>
"Select * from Country".
2. Встановити властивість Active в True p>
Якщо звернення йде до локальних даних, то замість псевдоніма можнавказати повний шлях до каталогу, де знаходяться таблиці. p>
Об'єкт TQuery один з найбільш корисних і гнучких компонентів, доступнихв Delphi. За допомогою можна скористатися всією потужністю, що надаєтьсялідерами серед промислових SQL серверів, на зразок InrterBase, Oracle або
Sybase. P>
Властивість SQL p>
Властивість SQL - мабуть, найважливіша частина TQuery. Доступ до цьоговластивості відбувається або через Інспектор Об'єктів під час конструюванняпроекту (design time), або програмно під час виконання програми (runtime). p>
Цікавіше, звичайно, отримати доступ до властивості SQL під час виконання,щоб динамічно змінювати запит. Наприклад, якщо потрібно виконати три
SQL запиту, то не треба розміщувати три компоненти TQuery на формі. Замістьцього можна розмістити один і просто змінювати властивість SQL три рази.
Найбільш ефективний, простий і потужний спосіб - зробити це черезпараметризрвані запити, які будуть пояснені в наступній частині.
Однак, спочатку досліджуємо основні особливості властивості SQL, а потімрозглянемо більш складні теми, типу запитів з параметрами. p>
Властивість SQL має тип TStrings, який означає, що це ряд рядків,зберігаються у списку. Список діє також, як і масив, але, фактично,це спеціальний клас з власними унікальними можливостями. У наступнихдекількох абзацах будуть розглянуті найбільш часто використовувані властивості. p>
При програмному використанні TQuery, рекомендується спочатку закритипоточний запит і очистити список рядків у властивості SQL: p>
Query1.Close; p>
Query1.SQL.Clear; p>
Потрібно зверніть увагу, що завжди можна "безпечно "викликати Close.
Навіть у тому випадку, якщо запит вже закрито, виняткова ситуаціягенеруватися не буде. p>
Наступний крок - додавання нових рядків у запит: p>
Query1.SQL.Add ( 'Select * from Country'); p>
Query1. SQL.Add ( 'where Name =''Argentina'''); p>
Метод Add використовується для додавання одного або кількох рядків дозапиту SQL. Загальний обсяг обмежений тільки кількістю пам'яті на вашіймашині. p>
Щоб Delphi відпрацював запит і повернув курсор, що містить результат увигляді таблиці, можна викликати метод: p>
Query1.Open; p>
Наприклад, наступний SQL запит: p>
Select * form Country where Name like 'C%' повертає DataSet, що містить всі записи, де поле Name починається злітери 'C'. Наступний запит дозволить побачити всі країни, у назві якихзустрічається буква 'C': p>
Select * from Country where Name like '% C %'; p>
Ось запит, яке знаходить всі країни, назва яких закінчуєтьсяна 'ia': p>
Select * from Country where Name like '% ia'; p>
TQuery і Параметри p>
Delphi дозволяє скласти "гнучку" форму запиту, званупараметризрвані запитом. Такі запити дозволяють підставити значеннязмінної замість окремих слів у висловах "where" або "insert". Цязмінна може бути змінена практично в будь-який час. (Якщовикористовується локальний SQL, то можна зробити заміну майже будь-якого слова взатвердження SQL, але при цьому та ж сама можливість не підтримуєтьсябільшістю серверів.) p>
Перед тим, як почати використовувати параметризрвані запити, розглянемознову одне з простих вищезазначених пропозицій SQL: p>
Select * from Country where Name like 'C%' p>
Можна перетворити це твердження в параметризрвані запит замінившиправу частину змінної NameStr: select * from County where Name like: NameStr p>
У цій пропозиції SQL, NameStr не є визначеною константоюі може змінюватися або під час дизайну, або під час виконання. SQLparser (програма, яка розбирає текст запиту) розуміє, що він маєсправу з параметром, а не константою тому, що параметрі передуєдвокрапка ": NameStr". Це двокрапка повідомляє Delphi про необхідністьзамінити змінну NameStr деякою величиною, яка буде відомапізніше. p>
Потрібно зверніть увагу, що слово NameStr було вибрано абсолютновипадково. Використовувати можна будь-яке припустиме ім'я змінної, так само,як вибирається ідентифікатор змінної в програмі. p>
Є два шляхи присвоїти значення змінної в параметризрвані запиті
SQL. Один спосіб полягає в тому, щоб використовувати властивість Params об'єкта
TQuery. Другий - використовувати властивість DataSource для отримання інформаціїз іншого DataSet. Ось ключові властивості для досягнення цих цілей: p>
property Params [Index: Word]; function ParamByName (const Value: string); property DataSource; p>
Якщо підставляти значення параметра в параметризрвані запит черезвластивість Params, то звичайно потрібно зробити чотири кроки: p>
1. Закрити TQuery
1. Підготувати об'єкт TQuery, викликавши метод Prepare
2. Присвоїти необхідні значення властивості Params
3. Відкрити TQuery p>
Другий крок виконується у тому випадку, якщо цей текст запитувиконується вперше, надалі його можна опустити. p>
Ось фрагмент коду, що показує як це може бути виконанепрактично: p>
Query1.Close; p>
Query1.Prepare; p>
Query1.Params [0]. AsString: = 'Argentina'; p> < p> Query1.Open; p>
Params - це індексовані властивість, яка має синтаксис як увластивості Fields для TDataSet. Наприклад, можна отримати доступ до першихзмінної в SQL запиті, адресуючи нульовий елемент в масиві Params: p>
Params [0]. AsString: = ' "Argentina "'; p>
Якщо параметризрвані SQL запит виглядає так: select * from Country where Name =: NameStr то кінцевий результат (тобто те, що виконається на самом деле) - ценаступна пропозиція SQL: select * from Country where Name = "Argentina" p>
Все, що відбулося, це змінної: NameStr було присвоєно значення
"Аргентина" через властивість Params. P>
Якщо в запиті міститься більше одного параметру, для того щоб матидоступ до них потрібно змінити індекс у властивості Params p>
Params [1]. AsString: = 'SomeValue'; або використовуючи доступ на ім'я параметра p>
ParamByName ( 'NameStr'). AsString: = ' "Argentina "'; p>
Отже, параметризрвані SQL запити використовують змінні, якізавжди починаються з двокрапки, визначаючи місця, куди будуть переданізначення параметрів. p>
Перш, ніж використовувати змінну Params, спочатку можна викликати
Prepare. Цей виклик змушує Delphi розібрати ваш SQL запит іпідготувати властивість Params так, щоб воно "було готове прийняти"відповідну кількість змінних. Можна присвоїти значення змінної
Params без попереднього виклику Prepare, але це буде працювати кількаповільніше. p>
Після того, як був викликає метод Prepare, і після того, як булиприсвоєні необхідні значення змінної Params, потрібно викликати метод Open,щоб закінчити прив'язку змінних і отримати бажаний DataSet. У нашомувипадку, DataSet повинен включати записи де у полі "Name" стоїть "Argentina". p>
Open або ExecSQL? p>
Після того, як буде складено SQL запит, є два різні способивиконати його. Якщо потрібно отримати курсор, то потрібно викликати Open. Якщовираз SQL не має на увазі повернення курсору, то потрібно викликати
ExecSQL. Наприклад, якщо відбувається вставка, видалення або оновлення даних
(тобто SQL запити INSERT, DELETE, UPDATE), то потрібно викликати ExecSQL. Тежсаме можна сказати по-іншому: Open викликається при запиті типу SELECT, а
ExecSQL - у всіх інших випадках. P>
Ось типовий SQL запит, який використовується для видалення запису зтаблиці: p>
delete from Country where Name = 'Argentina'; p>
Цей запит вилучив би будь-який запис з таблиці COUNTRY, яка маєзначення "Argentina" в полі Ім'я. p>
Не важко помітити, що це той випадок, коли зручно використовуватипараметризрвані запит. Наприклад, непогано було б змінювати ім'я країни,яку потрібно видалити: delete from Country where Name =: CountryName p>
У цьому випадку змінна: CountryName може бути змінена під часвиконання: p>
Query2.Prepare; p>
Query2.Params [0]: = 'Argentina'; p>
Query2.ExecSQL; p>
Код спочатку викликає Prepare, щоб повідомити Delphi що він повиненрозібрати SQL запит і підготувати властивість Params. Наступним крокомприсвоюється значення властивості Params і потім виконується підготовлений
SQL запит. Потрібно зверніть увагу, що він виконується через ExecSQL, аНЕ Open. p>
6. Подібності та відмінності TTable і TQuery p>
Хоча компоненти TTable і TQuery і є нащадками класу TDataSet ібагато в чому, методика роботи з об'єктом TQuery схожа на методику роботи з
TTable, однак є свої особливості. P>
Оскільки в ряді випадків компоненти TTable і TQuery в додаткахвзаємозамінні, то виникає питання - який же з них використати? p>
При роботі з локальними базами даних частіше використовується Table. З йогодопомогою простіше не тільки переглядати таблицю бази даних, але ймодифіковані записи, видаляти їх, додавати нові. Але при роботі з клієнт
- Серверними базами даних компонент Table стає мало ефективним. Уцьому випадку він створює на комп'ютері користувача тимчасову копію серверноїбази даних і працює з цією копією. Природно, що подібна процедуравимагає великих ресурсів і суттєво завантажує мережу. p>
Цей недолік відсутній у компоненті Query. Якщо запит SQL зводитьсядо перегляду таблиці (запит Select), то результат цього запиту (а не самавихідна таблиця) поміщається в тимчасовому файлі на комп'ютері користувача.
Щоправда, на відміну від набору даних, що створюється Table це таблиця тількидля читання і не допускає якихось змін. Втім, це обмеженняможна обійти. Якщо ж запит SQL пов'язаний з якимись змінами вмістутаблиці, то ніяких тимчасових таблиць не створюється. BDE передає запит насервер, там він обробляється і в додаток повертається інформація про те,чи успішно завершена відповідна операція. Завдяки такій організаціїроботи ефективність Query при роботі в мережі стає набагато вище, ніжефективність Table. До того ж мова SQL, дозволяє формулювати складнізапити, які не завжди можна реалізувати в Table. p>
З іншого боку, при роботі з локальними даних ефективність Queryпомітно нижче ефективності Table. Уповільнення обчислень виходить вельмивідчутним. p>
Виходячи з цього короткого огляду можливостей Table і Query, можнависновок, що в клієнт - серверних застосуваннях доцільніше використовуватикомпонент Query, а при роботі з локальними базами даних де не потрібна міцькомпонента Query простіше використовувати Table. p>
7. Висновок p>
Який компонент вибрати при розробці додатків баз даних Table або
Query? Відповідь на це питання не складний. Якщо програма клієнт - серверне,то однозначно доцільніше використовувати компонент Query, оскільки по -перше, він більш гнучкий і набагато потужніше Table, а по-друге не завантажуємережу, а якщо база даних локальна, то в багатьох випадках можна обійтися
Table, тому що робота з ним набагато простіше і де не потрібно міць SQL --запитів він цілком може замінити Query. p>
8. Додаток p>
Щоб показати реальну роботу компонентів Delphi для роботи з базамиданих я наведу приклад програми працює з БД «Довідник співробітника
ГИБДД ». P>
Мета цієї програми - облік автомобілів їх характеристик, дані про їхвласників, різних порушеннях допущених ними, а також відомості протех.осмотрах. p>
База даних складається з 6 таблиць: p>
1. Autos - дані про автомобілях p>
2. Colors - кольори p>
3. Construction - типи кузова p>
4. Driver - дані про водіїв p>
5. Marks - марки автомобілів p>
6. Ugon - дані про викрадені автомобілі p>
p>
рис 1. Головна форма програми p>
Робота програми починається з підключення до БД за допомогою пункту меню БД-
Підключитися або натискання комбінації клавіш "Alt + C". Відключення - БД-
Від'єднатись/Вихід або натискання клавіші F10. P>
Пункт меню «Работа» містить у собі наступні підпункти: «Пошукавтомобіля »(рис.2) та« Запрошення на тех.осмотр »(рис.3). У першупідпункті ведеться пошук, є можливість пошуку транспортного засобуза різними критеріями.
p>
рис 2. Форма пошуку для пошуку транспортного засобу p>
p>
рис 3. Форма транспортних засобів підлягають тех.осмотру p>
У другому підпункті меню «Работа», ведеться робота з власникамитранспортних засобів, який прострочив дату тех.осмотра. Є можливістьпошуку власника за прізвищем, а також можливість друку запрошення натехнічний огляд транспортного засобу. Вид вікна друку даногозапрошення наведено на рис. 4.
p>
рис 4. Вид вікна звіту «Запрошення на те.осмотр» p>
Також через пункти меню проводиться виклик довідників для роботи зданими. У додатку існує 6 видів довідників: автомобілі,водії, марки, тип кузова, колір, викрадені автомобілі. p>
Основним довідником є довідник «Автомобілі» (рис.6), тутзосереджені дані про всі автомобілі та їх власниківзареєстрованих в базі даних. p>
p>
рис 5. Довідник автомобілів p>
Список використаної літератури: p>
1. В. Фаронов «Програмування баз даних в Delphi 6» Пітер 2003 p>
2. А. Я. Архангельський «Програмування в Delphi 6» Біном 2003 p>
3. В. Бобровський «Delphi 5» Питер 2001 p>
4. И. Ю. Баженова "Delphi 5 Самоучитель програміста» Кудиц-Образ 2001 p>
----------------------- p> < p> Таблиця бази даних p>
data set p>
Table, Query або StoredProc p>
data source p>
DataSource p>
Візуалізація та управління: DBGrid, DBEdit, DBNavigator p>
? p>