Підключення до Бази даних
При роботі з базою даних перше, що повинна вміти робити програма, це підключатися до бази даних. Через це підключення до БД програма буде відправляти запити і приймати результати його виконання.
Припустимо, що:- Вже вибрано сервер БД і ми знаємо його ім'я.
- Тип вибраного сервера підтримується компонентами доступу, які ви використовуєте (у прикладі використовується erDA).
- База даних вже створена з'єднання з нею вже перевірено стандартними засобами сервера і все працює.
- У Delphi вже створена форма (або DataModule), в якій ми будемо створювати це підключення.
Для опису типу сервера і параметрів підключення до нього як правило іспользуетсяоб'ект в своїй назві містить DataBase або Connection. (В erDA це TerDataBase, в ADO це TADOConnection, в BDE це TDataBase). Зазвичай рекомендується на всі додаток створюється один такий об'єкт, і вся подальша робота йде через нього. У разі BDE і ADO можна обійтися і без цього об'єкта, але тоді складно організувати гарний діалог для входу в систему, важко зробити кнопку відключення від БД. і практично неможливо контролювати кількість активних підключень (сесій) - які на даний момент встановила програма з сервером.
Після створення компонентів бажано присвоїти йому читане ім'я. Обізву його DB.
Як правило при запуску програма повинна запитати у користувача ім'я та пароль, для підключення до бази даних. Так само при цьому бажано дати користувачу вибору бази даних з якої він буде працювати. Ця можливість як правило реалізується у подіях onLogin. BeforeConnect, або інші в залежності від компонентів, де показується форма для введення пароля, потім отримані дані передаються в властивості компонента.
У зв'язку з тим, що BDE і ADO автоматично створюють підключення до БД коли це необхідно подальша установка не потрібно.
У erDA є можливість контролювати кількість активних сесій, і то, через яке саме підключення буде виконаний запит. Для цього використовується об'єкт TerTransaction там же описані методи для роботи з транзакцією. У зв'язку з тим, що MSSQL не дозволяє одночасно тримати кілька відкритих і не "витягнених" запитів на одну сесію, в TerTransaction реалізований механізм, який при відкритті наступного запиту або зупиняє, або викачує весь попередній запит на клієнта (варіант поведінки можна вибрати за допомогою властивості FreeAction компонента TerTransaction).
Зазвичай просто достатньо покласти TerTransaction на форму разом з TerDataBase і прописати властивість DataBase. Якщо ви не хочете домогтися якого-небудь іншого ефекту. Я наприклад розділяю запити на 2 частини 1-я запити до невеликих довідників і 2-я запити які можуть повертати велику кількість записів. Для 1-ї частини створюю свою Transaction для другої свою з властивістю FreeAction = erStopFetch. В результаті - якщо користувач відкриє 2 "довгих" запиту, то витягування першого просто зупиниться на тому місці, де він був на момент відкриття 2-го запиту.
Справа в тому, що якщо на сервері залишати не витягнуті дані - як це робить BDE, то на кожен «не витягнуте" запит створюється своє підключення. У разі якщо користувач забув закрити цей запит, то він так і залишається висіти і займати ресурси сервера, які все-таки не безмежні. У ADO за замовчуванням всі результати запиту відразу витягуються на клієнта, але це іноді призводить до довгого очікування закінчення процесу кешування.
При цьому кожен активний запит автоматично накладає ряд блокувань. Хоча при невеликій кількості користувачів це не принципово, але при збільшенні кількості користувачів з цим доводиться рахуватися. На жаль, зазвичай, коли до цього доходить справа (після написання програми), вирішувати цю проблему дуже навіть не просто. Набагато простіше, коли завдання роботи програми з великою кількістю клієнтів ставилася спочатку, і відразу були вжиті заходи по зменшенню кількості блокувань.
У демонстраційній програмі використовується сервер БД MSSQL ім'я сервера Test, база даних TestDB.
Для підключення до нього необхідно прописати наступні властивості TerDataBase: