Форум: "Прочее";
Текущий архив: 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