![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 | |||
Регистрация: 05.03.2011
Сообщений: 5
|
![]()
Здравствуйте. Пожалуйста, помогите с оформлением класса, обеспечивающего доступ к БД. Дело в том, что у меня не очень богатый опыт работы с ООП в Delphi.
Есть программа, которая должна работать с базами данных через UniDAC (или ADO, не суть важно), при этом сами базы могут отличаться - это может быть как SQL Server, так и Oracle, так и любая другая. Само собой, это подразумевает наличие специфических для каждой БД особенностей и запросов - например, для получения списка всех таблиц в базе данных SQL Server предполагается использовать, например, 'EXEC sp_databases', который естественно не будет работать с Oracle. На мой взгляд хорошим решением было бы создание класса, в котором хранятся все методы работы с базой данных, а при его создании в конструкторе Create указывать тип БД (SQLServer или Oracle) Цитата:
Цитата:
GetServerStructure заменялась бы на функции GetOracleStructure или GetSQLServerStructure, содержащиеся в том же классе. Вопрос - можно ли это реализовать и как именно? Заранее благодарен! P.S. Возможно стоить сделать класс-наследник базового TDBEngine для каждой базы данных (например TDBOracleEngine) с заменой всех специфических для БД методов своими, и при создании экземпляра из главной формы выбирать тот, который нужен? Цитата:
Последний раз редактировалось DrunkPacifist; 18.08.2013 в 00:10. |
|||
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
![]()
Тут проблема не в компоненте, а вообще в возможности программного адаптирования запросов любой сложности под тип СУБД. Диалекты языков и возможности СУБД достаточно различаются и очень сомневаюсь, что реально можно это осуществить. Разве что принудительно ограничиться возможностями стандарта SQL/89, и то проблемно. ADO-провайдеры не зря делают под каждую СУБД
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
![]() |
![]() |
![]() |
#3 | |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,434
|
![]()
В реализации не шибко сложно.
Пусть будет объект TMyDB. У него есть поле fCase(fCase: type TDBCase =(cAccess,cSQLServer,cPostgree,cOra cle,...) ![]() Далее общие методы БД: TMyDB.Select(aTpl:TDBTemplate; aArgs:array of variant); TMyDB.Insert(aTpl:TDBTemplate; aArgs:array of variant); TMyDB.иТ.Д.(aTpl:TDBTemplate; aArgs:array of variant); Вот тут самое интересное: Объект TDBTemplate(его вы тоже реализуете), является шаблоном нужного вам запроса, содержит массив из строк, и метод подстановки параметров aArgs. Размера массива строк равен размеру(кол-во вариантов) TMyDB.fCase. Т.е. каждая строка это отдельный вариант запроса для какой-то БД fCase. и далее ваш TDBTemplate в зависимости от TMyDB.fCase выбирает нужны вариант и подставляет в него параметры из массива aArgs, затем передает SQL запрос все в тот же общий метод обращения к БД вашего TMyDB, где в зависимости от fCase вы специфично отсылаете запрос и так же получаете ответ. Получается что-то вроде шаблонов. И эти шаблоны надо где-то хранить. Пример привести не могу т.к. знаю пока MS Access да и то через пень-колоду. Цитата:
Начиная с TObject и заканчивая отображением IDE базовый предок TObject оброс overMilliard свойств, параметров, методов, функций. Да, можно. НО лучше не обьекты а интерфейсы и вот почему: в случае с объектами можно только так: Код:
Пользовать интерфейсы! В случае с интерфейсами же: Код:
Надеюсь вам это как-то пригодится. Последний раз редактировалось Человек_Борща; 18.08.2013 в 02:22. |
|
![]() |
![]() |
![]() |
#4 | |
Регистрация: 05.03.2011
Сообщений: 5
|
![]() Цитата:
|
|
![]() |
![]() |
![]() |
#5 | |
Старожил
Регистрация: 30.12.2009
Сообщений: 11,434
|
![]() Цитата:
![]() А вы сделаете 1 общий для всех. Допустим та же выборка из БД SELECT. Код:
|
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Вопрос по ООП | frem-dag | Общие вопросы C/C++ | 3 | 17.10.2010 17:45 |
Вопрос про ООП | Unconnected | Общие вопросы Delphi | 15 | 13.02.2010 20:22 |
Вопрос по ООП | rocky7 | Общие вопросы C/C++ | 5 | 21.08.2009 11:34 |
Вопрос по программированию в C++(ООП) | Katya Melody | Помощь студентам | 2 | 24.04.2009 01:08 |