Форум: "Базы";
Текущий архив: 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.053 c