Главная страница
    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 ау :)



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

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

Наверх




Память: 0.54 MB
Время: 0.033 c
3-40896
dk
2003-10-25 11:16
2003.11.13
Есть ли альтернатива lookup полям?


1-41139
karan
2003-10-31 11:51
2003.11.13
ActiveX


8-41757
Дмитрий Мыльников
2003-07-08 17:46
2003.11.13
Вопрос по TWAIN


3-41013
denmin
2003-10-14 11:02
2003.11.13
Как настроить клиента для MS SQL 2000?


1-41495
Ник
2003-10-28 15:46
2003.11.13
Графический редактор





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский