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

Вниз

Обработка 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.003 c
15-1310117366
Bober1
2011-07-08 13:29
2011.11.06
service application


2-1310738232
Aljonushka
2011-07-15 17:57
2011.11.06
Как вставить столбец данных из Экселя в СтрингГрид?


1-1271097346
Виталий Панасенко(дом)
2010-04-12 22:35
2011.11.06
Fast Report 3, не передаются значения переменным


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


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





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