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

Вниз

Обработка Dataset в потоке. Клонирование?   Найти похожие ветки 

 
SQLEXPRESS   (2011-07-12 11:44) [0]

Пишу класс, есть property
   property DS: TDataSet read GetDS write SetDS;
далее, что бы перебирать в отдельном потоке создаю TClientDataSet, копирую туда все. Для того, что бы дать пользователю сменить набор данных, возможно, запустить еще поток.

procedure TWEThread.SetDST(const Value: TDataSet);
var
 i: Integer;
 BM: TBookmark;
begin
 if Value.IsEmpty then
   raise Exception.Create("TDataSet is Empty");
 FDST := TClientDataSet.Create(nil);
 FDST.FieldDefs.BeginUpdate;
 FDST.FieldDefs := Value.FieldDefs;
 FDST.FieldDefs.EndUpdate;
 FDST.CreateDataSet;
 FDST.DisableControls;
 BM := Value.GetBookmark;
 Value.DisableControls;
 while not(Value.Eof) do
 begin
   FDST.Insert;
   for i := 0 to Value.FieldCount - 1 do
     FDST.Fields[i].Value := Value.Fields[i].Value;
   FDST.Post;
   Value.Next;
 end;
 Value.EnableControls;
 Value.GotoBookmark(BM);
 FDST.First;
 Beep;
end;

т.е. далее где то в потоке в Execute
   while not(FDST.Eof) do
   begin
     Work;
     FDST.Next;
   end;

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

В ADO есть метод Clone. Его не нашел в ODAC. А также используем UniDAC, его еще не смотрел вообще.

Как клонировать DataSet для моих целей?
ИЛИ стоит вообще подход изменить? На какой?


 
Сергей М. ©   (2011-07-12 12:47) [1]

TClientDataSet.CloneCursor

Но в другом потоке обработать клонированный дейтасет не получится.


 
tesseract ©   (2011-07-12 13:07) [2]

Через SQL INSERT/UPDATE не покатит? Быстрее в разы и безо всяких потоков.


 
DiamondShark ©   (2011-07-12 14:22) [3]

Копирование датасета лучше сделать не перебором, а сохранением в стрим и загрузкой в новый.


> пока данные копируются проходит время, набор может быть
> сменен

Доступ к property DS: TDataSet защитить критческой секцией, или TMultipleReadExclusiveWriteSynchronizer


 
SQLEXPRESS   (2011-07-12 14:27) [4]


> Сергей М. ©   (12.07.11 12:47) [1]

жаль, тогда не подходит


> tesseract ©   (12.07.11 13:07) [2]

не понял.

Что получается
Данные получены не понятно из какой БД, заранее непонятно.
Но компоненты их содержащие совместимы с TDataSet.
Данные копирую, в созданный тут же ClientDataSet, работаю с ними.
Не понимаю куда INSERT/UPDATE делать?


 
SQLEXPRESS   (2011-07-12 14:28) [5]


> Доступ к property DS: TDataSet защитить критческой секцией

тоже так думаю


> сохранением в стрим и загрузкой в новый.

точно.
попробую сейчас..


 
tesseract ©   (2011-07-12 15:13) [6]


> Данные получены не понятно из какой БД, заранее непонятн


Какая разница откуда они получены? Создаешь запрос - потом в транзакции его выполняешь. Зачем датасет по потокам таскать ?


 
Loginov Dmitry ©   (2011-07-12 22:33) [7]


> пока данные копируются проходит время, набор может быть
> сменен
> Что будет с копией страшно предположить


Вот один из способов быстрого копирования данных в TClientDataSet:


uses DBClient, Provider...  

       cds := TClientDataSet.Create(nil);
       Prov := TDataSetProvider.Create(nil);
       try          
         Prov.DataSet := SourDS;
         Prov.Name := "MyDataProvider";
         cds.ProviderName := Prov.Name;
         cds.Open;
      finally
        Prov.Free;
      end;



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

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

Наверх




Память: 0.48 MB
Время: 0.005 c
2-1310950620
R_R
2011-07-18 04:57
2011.11.06
TImage не растягивается вслед за формой...


2-1311147933
oleg_veles
2011-07-20 11:45
2011.11.06
Работа со строками в Мемо


15-1310284397
@!!ex
2011-07-10 11:53
2011.11.06
Как делать небольшие смс рассылки?


1-1271942672
Delpherrr
2010-04-22 17:24
2011.11.06
Как изменить TextHeight формы в RunTime?


11-1210765847
Vinum
2008-05-14 15:50
2011.11.06
StringGrid+DateTimePicker