Главная страница
    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.47 MB
Время: 0.003 c
2-1310495966
@Дениска
2011-07-12 22:39
2011.11.06
low-order word


2-1310730839
Anthony
2011-07-15 15:53
2011.11.06
Изменить цвет выделения в TRichEdit


2-1310551471
начинающий2
2011-07-13 14:04
2011.11.06
if или case


15-1310017395
И. Павел
2011-07-07 09:43
2011.11.06
Запрет на повторный запуск программы под одним пользователем


15-1310278541
antonn (work)
2011-07-10 10:15
2011.11.06
fastmm4 и работа без ide





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