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

Вниз

Позволяет ли 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.008 c
1-68386
Still Swamp
2003-08-07 18:38
2003.08.21
Указатель на функцию


14-68502
VEG
2003-08-05 19:03
2003.08.21
Как заставить в LPT на штырек подавать 1/0


3-68195
Vorobyev Sergey
2003-07-25 15:13
2003.08.21
Задачка SQL-щикам! Возможно ли следующее одним SQL запросом..


14-68488
VEG
2003-08-06 00:31
2003.08.21
У кого стоит WIN NT/2k/XP ???


4-68589
demonyator
2003-06-15 02:15
2003.08.21
Как заставить все окна изменить свои размеры.....





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