![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| DrunkPacifist |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 30.4.2012 Репутация: нет Всего: нет |
Здравствуйте. Пожалуйста, помогите с оформлением класса, обеспечивающего доступ к БД. Дело в том, что у меня не очень богатый опыт работы с ООП в Delphi.
Есть программа, которая должна работать с базами данных через UniDAC (или ADO, не суть важно), при этом сами базы могут отличаться - это может быть как SQL Server, так и Oracle, так и любая другая. Само собой, это подразумевает наличие специфических для каждой БД особенностей и запросов - например, для получения списка всех таблиц в базе данных SQL Server предполагается использовать, например, 'EXEC sp_databases', который естественно не будет работать с Oracle. На мой взгляд хорошим решением было бы создание класса, в котором хранятся все методы работы с базой данных, а при его создании в конструкторе Create указывать тип БД (SQLServer или Oracle)
и чтобы в зависимости от этого параметра при последующем выполнении, скажем, функции, которая бы отображала список всех баз данных на сервере
выполнялась функция, соответствующая текущему типу БД, т.е. GetServerStructure заменялась бы на функции GetOracleStructure или GetSQLServerStructure, содержащиеся в том же классе. Вопрос - можно ли это реализовать и как именно? Заранее благодарен! P.S. Возможно стоить сделать класс-наследник базового TDBEngine для каждой базы данных (например TDBOracleEngine) с заменой всех специфических для БД методов своими, и при создании экземпляра из главной формы выбирать тот, который нужен?
P.P.S. Надеюсь я изложил проблему не слишком сумбурно, если что, то поправьте меня |
||||||
|
|||||||
| k0rvin |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 442 Регистрация: 24.1.2010 Репутация: 1 Всего: 5 |
Возможно и именно так и нужно сделать. -------------------- “Object-oriented design is the roman numerals of computing.” — Rob Pike All software sucks |
|||
|
||||
| Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
Заведи поле у своего класса. К примеру FDbProviderName. В конструкторе присваевай этому полю значение AProvider. В GetServerStructure проверяй значение FDbProviderName и в соответствии с ним выполняй или GetOracleStructure, или GetSQLServetStructure. Это самый простой вариант. Можно сделать с наследниками и перекрытием методов, но это будет более трудозатратно. Нужно детально оценить, а стоит ли игра свеч? Для данной озвученной задачи я бы не стал так делать. Но если где-то там "за кулисами" прячется огромная работа, то может и стоит сделать класс-родитель и два наследника.
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
| Akella |
|
|||
![]() Творец ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 18485 Регистрация: 14.5.2003 Где: Корусант Репутация: 36 Всего: 329 |
Я думаю, что не нужно писать свой лисапед, а использовать UniDAC. Думаю, что там много уже чего реализовано.
|
|||
|
||||
| Дмитрий Каруна |
|
|||
|
Unregistered |
Этот подход реализован в ORM фреймворках. Как пример TMS Aurelius. Сурсы можно найти в нете.
Этот ответ добавлен с нового Винграда - http://vingrad.com |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |