![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Предок для класса с записью в БД [D7]
kosm © (2003-10-09 10:00:00)
Уважаемые Мастера!
Подскажите плиз, какого предка лучше (или однозначно) выбрать, для класса, который бы мог сохранять данные в БД. Тип БД пока не важен, но скорее всего это будет MSSQL или IB.
Пока напрашивается TDataset. Если использовать его, то какие методы придется переписывать?
PS: Посоветуйте хорошую литературу по данной тематике, плиз. Если в эл.виде такая где-то пробегала, то тоже не плохо :)
СПАСИБО!
kosm (2003-10-13 10:47:00) [21]
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.
А ты, я так понял, предлогал универсальный класс. Или нет?
kosm (2003-10-13 10:38:00) [22]
2vuk
Почитал я то что ты дал. Дело в том, что я не хочу хранить объекты и не хочу иметь что-то типа ОРСУБД - мне просто хочется оперировать внутри программы не просто данными из запроса, а объектами. Объекты сами будут грузить и выгружать инфорацию в РСУБД.
kosm (2003-10-13 10:32:00) [23]
2kaif
Да, тут маленько не о том речь. Я хочу не хранить объекты в БД, а представлять информацию из БД в виде объекта, с соответствующими методами.
Polevi (2003-10-11 12:58:00) [24]
>kaif © (10.10.03 23:57) [31]
не понимаешь
kaif (2003-10-10 23:57:00) [25]
Извини, конечно, что вмешиваюсь в столь захватывающий диалог про методы класса TPersistent. Путь, по которому ты решил пойти, вообще-то интересен... Может у тебя чего и выйдет, не знаю...
Насколько я понимаю, базой данных ты называешь просто кладбище объектов?
То есть тебе важно объекты просто ХРАНИТЬ в базе и никоим образом потом не пытаться выяснить, какие объкты имеются в базе, сколько их и вообще пусть лежат себе там, как лежали...
Так что ли?
Если ты пишешь игру типа стратегии, а объекты, хранящиеся в базе, это просто разные предметы и бонусы, лежащие на карте, то может ты и прав.
Но если ты хочешь написать программыу, реализующую какие-то бизнес-процессы, а потом и отчеты, то ИМХО, нужно сначала почитать про сущности и связи, реляционную модель и нормализацию.
Если же тебе все это окажется не нужным, то тогда незачем выбирать сервер баз данных в качестве хранилища. Используй обычный TFielStream или dfm-ресурс и храни всю эту лабуду так, как она хранится обычно, то есть в ФАЙЛЕ.
Так как единственное, за что платят люди, покупая сервер баз данных, так это именно за возможность в дальнейшем хитро манипулировать с данными, а не просто ПОМЕЩАТЬ их в базу, а затем ВЫУЖИВАТЬ их оттуда обратно в том же порядке.
Возможно я чего-то не понимаю... Старый стал наверно.
kosm (2003-10-10 19:07:00) [26]
2vuk
Ага, сенкс! Просто искал по дельфевому хелпу...
Смотрю TCollection.GetPropName по тому же принципу огранизован...
vuk (2003-10-10 18:29:00) [27]
GetPropInfos - не метод, а процедура, находится в модуле TypInfo.
kosm (2003-10-10 18:04:00) [28]
2Polevi
Разбор полетов твоего примера :)
Сереж, не понятны два момента, растолкуй плизл, а?
1) var Props: PPropList; - что это за структура? Какого вида?
2) Не пойму что за метод такой GetPropInfos(AObject.ClassInfo, Props)? Где он реализуется?
СПАСИБО!
kosm (2003-10-10 17:02:00) [29]
Ясненько... Дааа, интересные дискуссии!
vuk (2003-10-10 16:00:00) [30]
to kosm:
>На чем остановилися?
Ни на чем не остановился. Все работает в классической двузвенке.
kosm (2003-10-10 15:56:00) [31]
2Polevi
Ага, понял. Vuk-у тоже биг сенкс! Похоже ссылочки как раз по теме.
Будем вникать... :)
ВСЕМ БИГ СЕНКС!
PS 2Vuk
Зашел по твоим ссылкам - вроде то что надо, почитаю седня вечерком. Но вопрос. Я так понимаю ты тоже интересовался этой темой? На чем остановилися? Как твое мнение?
Vuk (2003-10-10 13:49:00) [32]
Ещё:
http://www.delphikingdom.ru/asp/talktopic.asp?ID=215
Vuk (2003-10-10 13:35:00) [33]
to kosm:
>Не совсем понимаю о чем речь :( Можно по-подробнее?
Почитайте здесь:
http://www.delphikingdom.com/asp/talktopic.asp?ID=161
Polevi (2003-10-10 11:15:00) [34]
>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;
kosm (2003-10-10 10:34:00) [35]
2vuk
Не совсем понимаю о чем речь :( Можно по-подробнее?
kosm (2003-10-10 10:33:00) [36]
2Polevi
Ага, это момент понял - сенкс! Т.е. эти классы будут отвечать за сохранение/восстановление данных из БД.
А каково назначение этого класса? И что значит учим сохранять Published свойства?
--
>TPersistObject=class(TPersistent)
>учим этот класс сохранять Publiched св-ва в TStorage
Извини, если напрягаю вопросами, просто хочется в этом разобраться. Кстати, книженцию начал читать Delphi 5: Руководство разработчика. Том 2. "К.Пачеко". Там вроде хорошо описана иерархия классов, их основные методы и назначение. Так что по возможности постараюсь больше глупых вопросов не задавать :)
vuk (2003-10-09 21:49:00) [37]
to kosm:
Может это и офтопик, но советую серьезно подумать перед попыткой реализации Persistent Framework, а стоит ли жертвовать эффективностью работы с данными, которую дает SQL в пользу удобства...
Polevi (2003-10-09 18:32:00) [38]
я тебе привел возможную иерархию, чтобы показать принцип. главное чтобы был базовый класс TStorage
procedure TStorage.PutObject(AObject:TPersistObject);virtual;abstract;
наследники будут перегружать данный метод
kosm (2003-10-09 18:06:00) [39]
И не говори ;)
А с TStream.ReadComponent пока не въехал... при чем абсолютно ;)) Будем разбираться дальше.
Кстати, описание этих классов что ты привел для примера...
--
TStorage=class
TDbStorage=class(TStorage)
TADOStorage=class(TDbStorage)
TSQLServerStorage=class(TADOStorage)
--
необходимо только для реализации универсального класса, который может сохранять данные в любую БД реализованую методами данных классов или для чего-то еще?
Просто сейчас подумал, если движек будет известен (скажем все тот же MSSQL), то в принципе, можно предком выбрать TADO..., и так оно будет наверно намного проще?
Polevi (2003-10-09 17:15:00) [40]
поздравляю, замечательный город, не правда ли ?
:-)