Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.08.21;
Скачать: CL | DM;

Вниз

Позволяет ли ClientDataSet хранить несколько таблиц в одном файле   Найти похожие ветки 

 
Tahion2   (2003-07-28 20:38) [0]

Позволяет ли ClientDataSet хранить несколько таблиц в одном файле?


 
AkaSaint ©   (2003-07-28 21:44) [1]

Да, делаешь им всем SaveToStream в один и тот же поток, где Stream: TFileStream, например.


 
sniknik ©   (2003-07-29 00:46) [2]

интересно а обратно считает?

(это не сарказм и не прикол, действительно не знаю, и в голову не приходило так делать и проверять тоже не хочу, ввиду прогнозируемости результата. но может кто пробовал? а вдруг)


 
Tahion2   (2003-07-29 11:46) [3]

>интересно а обратно считает?

Во, во.
У кого-нибудь есть пример кода, как сохранить несколько таблиц в один файл, а потом ОТКРЫТЬ их из него?

P.S. Может есть какой-либо усовершенствованный компонент - ClientDataSet с возможностью сохранить и загрузить несколько таблиц из одного файла?


 
Reindeer Moss Eater   (2003-07-29 12:03) [4]

Позволяет ли ClientDataSet хранить несколько таблиц в одном файле?

Конечно позволяет. А все потому, что хранением он не занимается.


 
Reindeer Moss Eater   (2003-07-29 12:13) [5]

Может есть какой-либо усовершенствованный компонент - ClientDataSet с возможностью сохранить и загрузить несколько таблиц из одного файла?

И куда их грузить если например структура таблиц разная?
А если одинаковая, то зачем несколько таблиц?


 
Polevi ©   (2003-07-29 12:38) [6]

свой формат, в заголовке хранить колво датасетов и смещение каждого от начала


 
Tahion2   (2003-07-29 15:36) [7]

Polevi, а можно пример того, как, пользуясь Stream-ами, загрузить две разные таблицы из одного файла?

***********
Несколько похожий вопрос:


ClientDadaSet1.SaveToFile(‘c:\1.cds’);

Как сделать так, чтоб помимо самой таблицы, в файле еще сохранялись и информация про ее отображение. Т.е. порядок столбцов, ширина столбцов, DisplayLabel и т.п.

И как потом эту информацию правильно загружать?

Обсуждается тут:
http://delphimaster.net/view/3-1059478003/


 
Reindeer Moss Eater   (2003-07-29 15:38) [8]

как, пользуясь Stream-ами, загрузить две разные таблицы из одного файла?

ClientDataSet1.LoadFromStream(Stream1);
ClientDataSet2.LoadFromStream(Stream1);



 
Polevi ©   (2003-07-29 15:57) [9]

2Reindeer Moss Eater (29.07.03 15:38)
сомневаюсь что будет работать, скорее всего 1 вызов попытается "заглотить чужие данные", наверняка промежуточный поток потребуется


 
Reindeer Moss Eater   (2003-07-29 15:59) [10]

скорее всего 1 вызов попытается "заглотить чужие данные",
Такой вывод можно сделать только зная формат.


 
Serginio   (2003-07-29 16:33) [11]

Намного проще вначале прописать интежер (4 байта) с размером стрима затем сам стрим, затем прочитать это количество байт в лученное св-во Data (посмотреть исходники LoadFromStream) и так для каждого ClientDataSet.
Также и с информацией про ее отображение.


 
Dred2k ©   (2003-07-29 18:49) [12]

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

Объект TClientDataSet внутри уже приспособлен для записи и восстановления из потока, содержащего данные нескольких датасетов. Только ему нужно чуть-чуть помочь ;)
Все дело в том, что методы SaveToStream и LoadFromStream вызывают protected-методы WriteDataPacket и ReadDataPacket соответсвенно. Самое интересное, что у последних есть два параметра: (Stream: TStream; Write(Read)Size: Boolean);
Последний вам ни о чем не говорит? ;)
Таким образом, делаем наследника следующего вида:


interface

TClientDataSetEx = class(TClientDataSet)
public
procedure SaveToStreamEx(AStream : TStream; AWriteSize : Boolean);
( AStream : TStream; AReadSize : Boolean)
Последовательные чтения после последовательной записи действительно по умолчанию хватают чужие данные... Но, на самом деле есть простое и красивое решение данной проблемы.

Объект TClientDataSet внутри уже приспособлен для записи и восстановления из потока, содержащего данные нескольких датасетов. Только ему нужно чуть-чуть помочь ;)
Все дело в том, что методы SaveToStream и LoadFromStream вызывают protected-методы WriteDataPacket и ReadDataPacket соответсвенно. Самое интересное, что у последних есть два параметра: (Stream: TStream; Write(Read)Size: Boolean);
Последний вам ни о чем не говорит? ;)
Таким образом, делаем наследника следующего вида:


interface

TClientDataSetEx = class(TClientDataSet)
public
procedure SaveToStreamEx(AStream : TStream; AWriteSize : Boolean);
procedure LoadFromStreamEx(AStream : TStream; AReadSize : Boolean);
end;

implementation

procedure TClientDataSetEx.SaveToStreamEx(AStream: TStream; AWriteSize : Boolean);
begin
WriteDataPacket(AStream, AWriteSize);
end;

procedure TClientDataSetEx.LoadFromStreamEx(AStream: TStream; AReadSize : Boolean);
begin
Close;
ReadDataPacket(AStream, AReadSize);
Open;
end;


Далее делаем компонент. Ставим на палитру и используем его.
Либо, при операции записи-чтения создаем временные объекты нового типа и через них пишем-читаем (Data кидаем туда-обратно, но это не особо эффективно по ресурсам и производительности).
Пример приведен для D4 (в D6 есть еще тип потока, но это не принципиально - передаем как есть). Разумеется, не следует забывать о последовательности записей-чтений. Кроме того, при этом можно между потоками информации датасетов размещать "хрень" по вкусу. ;)
Ну, вот и все.


 
Dred2k ©   (2003-07-29 19:03) [13]

Да, чуть не забыл. Реализацию методов SaveToStream и LoadFromStream нужно "подглядеть" в исходнике модуля (для разных версий дельфи возможны отличия, при написании компонента в общем виде - не забыть про версии компилера...).



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

Текущий архив: 2003.08.21;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.013 c
3-68192
Artemij
2003-07-28 13:47
2003.08.21
Изменение данных в таблице Paradox


3-68191
Magic&Wizard
2003-07-28 14:56
2003.08.21
Сохраняю выборку из базы, используя IBSQL .BatchOutPut/Input


3-68172
Donor
2003-07-28 11:44
2003.08.21
InterBase


4-68576
NED
2003-06-18 19:28
2003.08.21
Работа с семафорами


9-68142
Juster~
2003-02-11 17:29
2003.08.21
Синхронизация по времени