Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];

Вниз

Предок для класса с записью в БД   Найти похожие ветки 

 
kosm   (2003-10-09 10:00) [0]

Уважаемые Мастера!
Подскажите плиз, какого предка лучше (или однозначно) выбрать, для класса, который бы мог сохранять данные в БД. Тип БД пока не важен, но скорее всего это будет MSSQL или IB.
Пока напрашивается TDataset. Если использовать его, то какие методы придется переписывать?

PS: Посоветуйте хорошую литературу по данной тематике, плиз. Если в эл.виде такая где-то пробегала, то тоже не плохо :)

СПАСИБО!


 
Семен Сорокин   (2003-10-09 10:13) [1]

см. реализацию в DBTable и DB,
а чем стандартные не устраивают?


 
kosm   (2003-10-09 10:24) [2]

Стандартные - это какие?
Просто хотелось бы иметь базовый класс (допустим TCustomer) с необходимой структурой и методами. Методы же работы с БД переопределить в будущем потомке...
Или у меня не верный подход к этому делу? :) Просто накидать на форму TTable, TQuery и юзать их?


 
Семен Сорокин   (2003-10-09 10:31) [3]

стандартных много, все зависит от СУБД и выбора доступа к данным.
Например чем не устраивает TQuery?


 
Плохиш_   (2003-10-09 10:33) [4]

>kosm (09.10.03 10:24) [2]
> Просто накидать на форму TTable, TQuery и юзать их?


Да, для начала неплохо, а велосипед будешь изобретать потом ;-)


 
Anatoly Podgoretsky   (2003-10-09 10:43) [5]

TDataset наиболее общий универсальный предок, при конкретике можно выбрать далее по иерархии


 
Polevi   (2003-10-09 10:51) [6]

TPersistent


 
kosm   (2003-10-09 10:55) [7]

Просто хотелось бы оперировать сущностями, а не произвольными данными TQuery. К примеру, если я просто буду работать с VCL и формой, то при необходимости сохранить тот же TCustomer в БД, мне придется повторяться...

2Anatoly Podgoretsky
Т.е. лучше будет, если определиться с движком БД и выбрать уже далее по иерархии? Вопрос. Каким образом пишуться мультиплатформенные (в отношении движка) БД? Т.е. как разделить данные от методов их физического хранения в БД?
Или опять же не стоит это того и это лишняя трата времени, сил, и никакого толку?
Просто интересно мнение компетентных в этом специалистов.

СПАСИБО!


 
kosm   (2003-10-09 10:58) [8]

2Polevi
А можешь объяснить, почему?


 
Polevi   (2003-10-09 12:48) [9]

TPersistent encapsulates the behavior common to all objects that can read and write their properties to and from a stream


 
kosm   (2003-10-09 12:58) [10]

2Polevi
Это я читал. Ну а так в двух словах, в чем его приимущество?
И зачем мне стрим?


 
Polevi   (2003-10-09 13:16) [11]

TStorage=class
TDbStorage=class(TStorage)
TADOStorage=class(TDbStorage)
TSQLServerStorage=class(TADOStorage)

TPersistObject=class(TPersistent)
учим этот класс сохранять Publiched св-ва в TStorage

TCustomer=class(TDBPersistObject)
экземпляры TCustomer умеют сохранять себя в TStorage, нпример в базу MS SQL Server


 
Polevi   (2003-10-09 13:18) [12]

упс
TCustomer=class(TPersistObject)


 
kosm   (2003-10-09 13:49) [13]

Ок, БИГ СЕНКС! В общих чертах понял.

Если не сложно, не можешь объяснить, или ткнуть носом где глянуть (на примере), каким образом...
--
>TPersistObject=class(TPersistent)
>учим этот класс сохранять Publiched св-ва в TStorage

А еще лучше подскажи плиз, какую литературу стоит почитать. Сейчас очень много книжек, где описывается как кнопки нажимать, а хочется именно базу получить...

Благодарен за советы и помощь!


 
Polevi   (2003-10-09 15:55) [14]

посмотри как работает TStream.ReadComponent, TStream.WriteComponent


 
kosm   (2003-10-09 17:11) [15]

Сергей, огромное спасибо - посмотрю чо да как там.

А по литературе ничего не можешь подсказать?

PS: Кстати, я тоже из Питера :)


 
Polevi   (2003-10-09 17:15) [16]

поздравляю, замечательный город, не правда ли ?
:-)


 
kosm   (2003-10-09 18:06) [17]

И не говори ;)

А с TStream.ReadComponent пока не въехал... при чем абсолютно ;)) Будем разбираться дальше.

Кстати, описание этих классов что ты привел для примера...
--
TStorage=class
TDbStorage=class(TStorage)
TADOStorage=class(TDbStorage)
TSQLServerStorage=class(TADOStorage)
--
необходимо только для реализации универсального класса, который может сохранять данные в любую БД реализованую методами данных классов или для чего-то еще?
Просто сейчас подумал, если движек будет известен (скажем все тот же MSSQL), то в принципе, можно предком выбрать TADO..., и так оно будет наверно намного проще?


 
Polevi   (2003-10-09 18:32) [18]

я тебе привел возможную иерархию, чтобы показать принцип. главное чтобы был базовый класс TStorage

procedure TStorage.PutObject(AObject:TPersistObject);virtual;abstract;

наследники будут перегружать данный метод


 
vuk   (2003-10-09 21:49) [19]

to kosm:
Может это и офтопик, но советую серьезно подумать перед попыткой реализации Persistent Framework, а стоит ли жертвовать эффективностью работы с данными, которую дает SQL в пользу удобства...


 
kosm   (2003-10-10 10:33) [20]

2Polevi
Ага, это момент понял - сенкс! Т.е. эти классы будут отвечать за сохранение/восстановление данных из БД.

А каково назначение этого класса? И что значит учим сохранять Published свойства?
--
>TPersistObject=class(TPersistent)
>учим этот класс сохранять Publiched св-ва в TStorage

Извини, если напрягаю вопросами, просто хочется в этом разобраться. Кстати, книженцию начал читать Delphi 5: Руководство разработчика. Том 2. "К.Пачеко". Там вроде хорошо описана иерархия классов, их основные методы и назначение. Так что по возможности постараюсь больше глупых вопросов не задавать :)


 
kosm   (2003-10-10 10:34) [21]

2vuk
Не совсем понимаю о чем речь :( Можно по-подробнее?


 
Polevi   (2003-10-10 11:15) [22]

>vuk © (09.10.03 21:49) [19]
от SQL никто не отказывается, объекты хранятся в обычных таблицах, речь идет об абстрагировании клиента от способа хранения

>kosm (10.10.03 10:33) [20]
сохраняем published св-ва в xml-пакет

function GetObjectPropertis(AObject:TPersistent):string;
var
Props: PPropList;
TypeData: PTypeData;
i:integer;
sl:TStringList;
begin
sl:=TStringList.Create;
TypeData := GetTypeData(AObject.ClassInfo);
if (TypeData = nil) or (TypeData^.PropCount = 0) then Exit;
GetMem(Props, TypeData^.PropCount * sizeof(Pointer));
try
GetPropInfos(AObject.ClassInfo, Props);
for i := 0 to TypeData^.PropCount-1 do
case Props^[I]^.PropType^.Kind of
tkChar, tkString, tkLString, tkWChar, tkWString: // ?????????? ??????
begin
sl.Add(Format("%s="%s"",[AnsiUpperCase(PPropInfo(Props^[I]).Name),GetStrProp(AObject, Props^[I])]));
end;
tkInteger,tkEnumeration: // ????? ?????
begin
sl.Add(Format("%s="%d"",[AnsiUpperCase(PPropInfo(Props^[I]).Name),GetOrdProp(AObject, Props^[I])]));
end;
tkFloat: // ????? ? ????????? ??????
begin
sl.Add(Format("%s="%f"",[AnsiUpperCase(PPropInfo(Props^[I]).Name),GetFloatProp(AObject, Props^[I])]));
end;
end;
sl.Insert(0,"<DATA");
sl.Add("/>");
Result:=sl.Text;
finally
Freemem(Props);
sl.Free;
end;
end;


 
Vuk   (2003-10-10 13:35) [23]

to kosm:
>Не совсем понимаю о чем речь :( Можно по-подробнее?
Почитайте здесь:
http://www.delphikingdom.com/asp/talktopic.asp?ID=161


 
Vuk   (2003-10-10 13:49) [24]

Ещё:

http://www.delphikingdom.ru/asp/talktopic.asp?ID=215


 
kosm   (2003-10-10 15:56) [25]

2Polevi
Ага, понял. Vuk-у тоже биг сенкс! Похоже ссылочки как раз по теме.
Будем вникать... :)

ВСЕМ БИГ СЕНКС!

PS 2Vuk
Зашел по твоим ссылкам - вроде то что надо, почитаю седня вечерком. Но вопрос. Я так понимаю ты тоже интересовался этой темой? На чем остановилися? Как твое мнение?


 
vuk   (2003-10-10 16:00) [26]

to kosm:
>На чем остановилися?
Ни на чем не остановился. Все работает в классической двузвенке.


 
kosm   (2003-10-10 17:02) [27]

Ясненько... Дааа, интересные дискуссии!


 
kosm   (2003-10-10 18:04) [28]

2Polevi
Разбор полетов твоего примера :)
Сереж, не понятны два момента, растолкуй плизл, а?
1) var Props: PPropList; - что это за структура? Какого вида?
2) Не пойму что за метод такой GetPropInfos(AObject.ClassInfo, Props)? Где он реализуется?

СПАСИБО!


 
vuk   (2003-10-10 18:29) [29]

GetPropInfos - не метод, а процедура, находится в модуле TypInfo.


 
kosm   (2003-10-10 19:07) [30]

2vuk
Ага, сенкс! Просто искал по дельфевому хелпу...
Смотрю TCollection.GetPropName по тому же принципу огранизован...


 
kaif   (2003-10-10 23:57) [31]

Извини, конечно, что вмешиваюсь в столь захватывающий диалог про методы класса TPersistent. Путь, по которому ты решил пойти, вообще-то интересен... Может у тебя чего и выйдет, не знаю...
Насколько я понимаю, базой данных ты называешь просто кладбище объектов?
То есть тебе важно объекты просто ХРАНИТЬ в базе и никоим образом потом не пытаться выяснить, какие объкты имеются в базе, сколько их и вообще пусть лежат себе там, как лежали...
Так что ли?
Если ты пишешь игру типа стратегии, а объекты, хранящиеся в базе, это просто разные предметы и бонусы, лежащие на карте, то может ты и прав.
Но если ты хочешь написать программыу, реализующую какие-то бизнес-процессы, а потом и отчеты, то ИМХО, нужно сначала почитать про сущности и связи, реляционную модель и нормализацию.
Если же тебе все это окажется не нужным, то тогда незачем выбирать сервер баз данных в качестве хранилища. Используй обычный TFielStream или dfm-ресурс и храни всю эту лабуду так, как она хранится обычно, то есть в ФАЙЛЕ.
Так как единственное, за что платят люди, покупая сервер баз данных, так это именно за возможность в дальнейшем хитро манипулировать с данными, а не просто ПОМЕЩАТЬ их в базу, а затем ВЫУЖИВАТЬ их оттуда обратно в том же порядке.
Возможно я чего-то не понимаю... Старый стал наверно.


 
Polevi   (2003-10-11 12:58) [32]

>kaif © (10.10.03 23:57) [31]
не понимаешь


 
kosm   (2003-10-13 10:32) [33]

2kaif
Да, тут маленько не о том речь. Я хочу не хранить объекты в БД, а представлять информацию из БД в виде объекта, с соответствующими методами.


 
kosm   (2003-10-13 10:38) [34]

2vuk
Почитал я то что ты дал. Дело в том, что я не хочу хранить объекты и не хочу иметь что-то типа ОРСУБД - мне просто хочется оперировать внутри программы не просто данными из запроса, а объектами. Объекты сами будут грузить и выгружать инфорацию в РСУБД.


 
kosm   (2003-10-13 10:47) [35]

2Polevi
Сергей, биг сенкс за пример сохранения публичных свойств! Почитал, разобрался. Но осталость парочка не совсем понятных моментов.
1) Не понимаю назначение и использование этих классов (как пример)
--
TStorage=class
TDbStorage=class(TStorage)
TADOStorage=class(TDbStorage)
TSQLServerStorage=class(TADOStorage)
--
Т.е. по идее можно просто через предка от TQuery и RTTI все это реализовать?
--
TStorage = class(TQuery)
protected
function GetObjectProperties(AObject:TPersistent): string;
published
procedure Save;
end;

TCustomer = class(TStorage)
--
Только правда тогда этот класс будет жестко завязан на BDE.

А ты, я так понял, предлогал универсальный класс. Или нет?


 
Polevi   (2003-10-13 10:53) [36]

причем тут TQuery


 
kosm   (2003-10-13 10:55) [37]

Вот именно... Чуствую я, что чего-то недопонимаю :)


 
kosm   (2003-10-13 10:58) [38]

Все время использовал копоненты (ну максимум создавал классы от TObject), не задумывался о иерархии классов и наследовании, полиморфизме, в общем об ООП как таковом - кидай на форму, выставляй что надо и как надо и все. Но это ИМХО не правильно, надо двигаться...


 
kosm   (2003-10-13 11:59) [39]

Да, похоже я всех достал... :))


 
kosm   (2003-10-13 16:47) [40]

Polevi ау :)


 
Vuk   (2003-10-13 16:50) [41]

Можно поподробнее о том, что Вы хотите сделать?
Каким образом возникают объекты в приложении? Какие будете использовать средства отображения (DB-контролы или что-то иное)? Каково взаимодействие с DataSet?


 
kosm   (2003-10-13 18:18) [42]

2Vuk
Просто хочу отображение данных из СУБД в объекты.
Объекты будут создаваться ручками (например при создании формы правки сущности).
Схема примерно такая:
DB -> Obj -> NON DBAware Controls -> Obj -> DB


 
Vuk   (2003-10-13 18:37) [43]

То есть хотите представления наборов данных в виде коллекций?


 
Vuk   (2003-10-13 18:40) [44]

Кстати, при неиспользовании DBAware controls рискуете потерять много удобных и полезных возможностей...


 
kosm   (2003-10-13 18:50) [45]

2Vuk
А как Вы посоветуете подойти к этому делу?
А если DBAware?


 
Vuk   (2003-10-13 19:02) [46]

Я могу только советовать думать. :o)

Вопрос в том, для чего именно нужно объектное представление данных и что, как Вы думаете, оно Вам даст. Ведь абстрагирование от конкретной БД может быть достигнуто и при обычном подходе. DataSet - чем не абстракция?

Кстати, чем будут с Вашей точки зрения являться результаты запросов в которых могут быть части данных отдельных сохраненных "объектов"?


 
Polevi   (2003-10-13 21:14) [47]

>Vuk © (13.10.03 19:02) [46]
вы согласны что с объектами удобнее работать чем с набором данных в TDataset ? получаем преимущества ООП - наследование и полиморфизм


 
Vuk   (2003-10-13 21:24) [48]

ещ Polevi:
>вы согласны что с объектами удобнее работать чем с набором
>данных в TDataset ?
Что в данном случае представляет из себя объект? Это только средство облегчение доступа к полям данных или нечто большее? Если нечто большее, то как это нечто функционирует?


 
Sergey_Masloff   (2003-10-13 21:36) [49]

kosm (13.10.03 18:18) [42]
>Просто хочу отображение данных из СУБД в объекты.
>Объекты будут создаваться ручками (например при создании формы >правки сущности).
>Схема примерно такая:
>DB -> Obj -> NON DBAware Controls -> Obj -> DB
У меня есть такой функционирующий проект. Несколько сотен установок, работает уже пару лет. Мой совет - не заморачивайся.
Вот это:
>DB -> Obj -> NON DBAware Controls -> Obj -> DB
потребует много рутинной писанины, а то что получится имеет преимущество перед обычной схемой с датасетами только в очень ограниченом числе случаев. Так что перед тем как это писать советую очень сильно подумать - нужно ли оно тебе.

Если есть конкретные вопросы - спрашивай.


 
kosm   (2003-10-15 13:34) [50]

2Vuk
Еще раз пробежался по твоим ссылочкам - чего-то как-то не весело. Там обсуждается ООП подход к БД в целом. Еще не все дочитал, но чего-то сдается мне, что действительно не стоит заморачиваться на все это :)
На самом деле я сам толком не представляю что из себя будет представлять объект и как будут представлены результаты запросов.
Так если прикинуть, то единичные записи в виде объектов, действительно интересно. А вот результат запроса в виде коллекци к примеру. Как их выводить в грид? Походу заморочек много будет :(
Вот если результаты запросов будут свойства типа Dataset, то было бы куда интереснее.

2Polevi
Похоже зря я все это затеял? :(
На самом деле, наследование и полиморфизм были бы просто супер, но достаточно было бы просто объеденить методы работы с сущьностью в одном классе - все ж было бы удобнее наверно?

2Sergey_Masloff
Интересно, как ты выводил список таких объектов.
За совет - спасибо, я похоже тоже к тому склоняюсь...


 
Sergey_Masloff   (2003-10-15 20:38) [51]

>Интересно, как ты выводил список таких объектов.
>За совет - спасибо, я похоже тоже к тому склоняюсь...
Ну у меня есть так скажем "крупные" бизнес-объекты, каждый из которых включает в себя множество дочерних и связаных - все "дочки" висели в виде linked list, некоторые в виде деревьев (а деревья часто имели общие "листья" - через SQL с этим было работать трудновато).

С коллекциями таких объектов пользователь работал, естественно, через датасеты и SQL потому что тащить весь объект когда пользователь интересуется одним из пары тысяч атрибутов - просто глупо. А вот когда нужный "бизнес-объект" найден он поднимался в объект - и понеслась ;-) Использовалось и наследование и полиморфизм и много чего - вобщем, мне нравится как это работает но ОЧЕНЬ много руками писать рутинного кода. Я даже подумывал написать генератор кода но потом текучка заела бросил на стадии работающего макета.


 
kosm   (2003-10-16 11:15) [52]

2Sergey_Masloff
Не совсем понял, как пользователь работал с коллекциями через датасет. Т.е. через обычные TDataset"ы (TQuery, TADO... и тп)?
Сергей, а пример реализации простенького класса "бизнес-объекта" не можешь кинуть (элемента какого нить справочника или тп)? Очень интересно как это выглядит.
А писанины я не боюсь... :)
СПАСИБО!


 
Sergey_Masloff   (2003-10-16 22:25) [53]

kosm (16.10.03 11:15) [52]
Блин, писал-писал а сообщение "слишком длинное". Ладно, кину в мыло.


 
kosm   (2003-10-17 11:10) [54]

Спасибо! Получил и описал ответ уже :)

А если работать через коллекции объектов (а не TDataset), то тогда это уже будет тот же BOLD по сути дела или я ошибаюсь? :)


 
Sergey_Masloff   (2003-10-17 12:28) [55]

kosm (17.10.03 11:10) [54]
>А если работать через коллекции объектов (а не TDataset), то >тогда это уже будет тот же BOLD по сути дела или я ошибаюсь? :)
не ошибаешься



Страницы: 1 2 вся ветка

Форум: "Базы";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.59 MB
Время: 0.042 c
14-41929
mm0
2003-10-20 18:02
2003.11.13
Помогите с кнопкой /Продолжение/Первое непомогло


3-40871
serp
2003-10-21 09:44
2003.11.13
Проблемы чтения данных через процедуру (delphi, oracle, dbx)


3-40855
Gia Gvatua
2003-10-21 08:48
2003.11.13
Problems with Paradox tables


3-41109
KA_
2003-10-23 09:06
2003.11.13
Проверка существования таблицы Interbase


3-41092
Master-Igor
2003-10-23 01:01
2003.11.13
когда я добавляю поле в ДБ видаєт ошибку Non-blob column in table





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский