Additional
dbCAP
AnyDAC
ThinDAC
NCOCI8
Topic: Клонирование набора данных...
Клонирование набора данных...
Posted: 2007/10/31 05:08
 
Всем привет!

Может быть мой вопрос надо задавать и не на этом форуме, но все же рискну...

Среда разработки приложения Delphi 7, компоненты AnyDAC 1.12.2

Есть DataSet. Есть необходимость его клонировать.
не просто банально присвоить типа:
dataset1 := dataset2,
а именно:
dataset1 := clone(dataset2);
Собстно говоря процедуру накидали клонирования, но есть загвоздка, наша процедура не может клонировать blob и memo поля...
кто нибудь сталкивался с такой задачей?
Re:Клонирование набора данных...
Posted: 2007/10/31 10:49
 
Привет

1) Форум самый что ни на есть правильный.

2) Что значит клонировать ?
- создать копию датасета с его данными;
- создать копию датасета, разделяющую его данные;
- как-нибудь иначе.
Т.е. опишите подробнее.

Удачи,
Дмитрий
Re:Клонирование набора данных...
Posted: 2007/11/02 01:26
 
Что значит клонировать ?

т.е. создать -создать копию датасета с его данными, не зависящими от первого. Т.е. когда я меняю в первом во втором не должно быть изменений.
Re:Клонирование набора данных...
Posted: 2007/11/02 06:55
 
Все!... Разобрался как клонировать набор данных...
кому надо могу подкинуть пример
Re:Клонирование набора данных...
Posted: 2007/11/02 07:36
 
Опубликуйте пример здесь.

Удачи,
Дмитрий
Re:Клонирование набора данных...
Posted: 2007/11/07 23:10
 
хорошо выложу...
тока ногами не бейте сильно
делал на спех, что получилось то получилось...
возможно кто-то что-то дополнит, усовершенствует.

Вообще для чего нужен был метод клонирования:
чтобы не выполнять один и тот же запрос два раза.

при клонировании возникали проблеммы с клонирование блоб и мемо полей. вот собственно говоря и возник вопрос, но все же сам разобрался.


 function CloneDS(DataSetTDataSet): TDataSet; var  Temp:TADClientDataSet;  integer;  MyBufferPChar;  oMemoryTMemoryStream;  oMemoStrString; begin  Result:=nil;  if not DataSet.Active then     begin       ShowMessage('Таблица пустая!'+crlf+'(DataSet не активный.)',48);       exit;     end;  Result:=DataSet;   Создаем датасе   Temp:=TADClientDataSet.Create(Application);   Temp.FormatOptions.StrsEmpty2Null:=false;   Temp.FormatOptions.StrsTrim:=true;   Temp.FormatOptions.MaxStringSize:=255;   определяем типы полей   for j:=0 to DataSet.FieldCount-do      begin         if (DataSet.Fields[j].DataType=ftStringthen            Temp.FieldDefs.Add(DataSet.Fields[j].FieldNameDataSet.Fields[j].DataTypeDataSet.Fields[j].DataSize)         else            Temp.FieldDefs.Add(DataSet.Fields[j].FieldNameDataSet.Fields[j].DataType);      end;    Temp.CreateDataSet;  забитие данных из основного датасета в клонированный  Temp.CachedUpdates:=true;  DataSet.First;  while not DataSet.Eof do     begin        Temp.Append;        for j:=0 to DataSet.FieldCount-do            begin              if not DataSet.Fields[j].IsBlob and not (DataSet.Fields[j].DataType ftAutoInc)  then                 begin                    GetMem(MyBufferDataSet.Fields[j].DataSize);                    try                       if DataSet.Fields[j].GetData(MyBufferthen                          Temp.Fields[j].SetData(MyBuffer);                    finally                       FreeMem(MyBufferDataSet.Fields[j].DataSize);                    end;                 end;              if DataSet.Fields[j].DataType ftAutoInc then                 begin                    oMemoStr := DataSet.Fields[j].AsString;                    Temp.Fields[j].AsString := oMemoStr;                 end;              if (DataSet.Fields[j].DataType=ftBlob) or (DataSet.Fields[j].DataType=ftmemothen                 begin                    oMemory := TMemoryStream.Create;                    try                      TBlobField(DataSet.Fields[j]).SaveToStream(oMemory);                      oMemory.Position := 0;                      TBlobField(Temp.Fields[j]).LoadFromStream(oMemory);                    finally                      oMemory.Free;                    end;                 end;            end;        Temp.Post;        DataSet.Next;     end;  Temp.First;  Result:=Temp; end;



Post edited by: Diman, at: 2007/11/07 23:51

Post edited by: ADAMAS, at: 2007/11/08 01:29