Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по ООП 
:(
    Опции темы
DrunkPacifist
Дата 18.8.2013, 10:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 30.4.2012

Репутация: нет
Всего: нет



Здравствуйте. Пожалуйста, помогите с оформлением класса, обеспечивающего доступ к БД. Дело в том, что у меня не очень богатый опыт работы с ООП в Delphi.

Есть программа, которая должна работать с базами данных через UniDAC (или ADO, не суть важно), при этом сами базы могут отличаться - это может быть как SQL Server, так и Oracle, так и любая другая. Само собой, это подразумевает наличие специфических для каждой БД особенностей и запросов - например, для получения списка всех таблиц в базе данных SQL Server предполагается использовать, например, 'EXEC sp_databases', который естественно не будет работать с Oracle.

На мой взгляд хорошим решением было бы создание класса, в котором хранятся все методы работы с базой данных, а при его создании в конструкторе Create указывать тип БД (SQLServer или Oracle)
Код

constructor TDBEngine.Create(AProvider : TDBProviderName);

и чтобы в зависимости от этого параметра при последующем выполнении, скажем, функции, которая бы отображала список всех баз данных на сервере
Код

Function TDBEngine.GetServerStructure : TTreeNode;

выполнялась функция, соответствующая текущему типу БД, т.е.
GetServerStructure заменялась бы на функции GetOracleStructure или GetSQLServerStructure, содержащиеся в том же классе.

Вопрос - можно ли это реализовать и как именно? Заранее благодарен!

P.S. Возможно стоить сделать класс-наследник базового TDBEngine для каждой базы данных (например TDBOracleEngine) с заменой всех специфических для БД методов своими, и при создании экземпляра из главной формы выбирать тот, который нужен?
Код

//что-то вроде этого
Case ProviderName of
dbSQLServer : DB := TDBSQLEngine.Create;
dbOracle : DB := TDBOracleEngine.Create;
End;

P.P.S. Надеюсь я изложил проблему не слишком сумбурно, если что, то поправьте меня
PM MAIL   Вверх
k0rvin
Дата 18.8.2013, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: 1
Всего: 5



Цитата(DrunkPacifist @  18.8.2013,  10:33 Найти цитируемый пост)
Возможно стоить сделать класс-наследник базового TDBEngine для каждой базы данных (например TDBOracleEngine) с заменой всех специфических для БД методов своими

Возможно и именно так и нужно сделать.


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
Poseidon
Дата 18.8.2013, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



Заведи поле у своего класса. К примеру FDbProviderName. В конструкторе присваевай этому полю значение AProvider. В GetServerStructure проверяй значение FDbProviderName и в соответствии с ним выполняй или GetOracleStructure, или GetSQLServetStructure. Это самый простой вариант. Можно сделать с наследниками и перекрытием методов, но это будет более трудозатратно. Нужно детально оценить, а стоит ли игра свеч? Для данной озвученной задачи я бы не стал так делать. Но если где-то там "за кулисами" прячется огромная работа, то может и стоит сделать класс-родитель и два наследника. 


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Akella
Дата 18.8.2013, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



Я думаю, что не нужно писать свой лисапед, а использовать UniDAC. Думаю, что там много уже чего реализовано.
PM MAIL   Вверх
Дмитрий Каруна
Дата 6.12.2013, 08:21 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Этот подход реализован в ORM фреймворках. Как пример TMS Aurelius. Сурсы можно найти в нете.

Этот ответ добавлен с нового Винграда - http://vingrad.com
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0517 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.