ADAMAS
User
 Junior Boarder
| Posts: 10 |   | Karma: 0 |
|
Re:Клонирование набора данных...
|
|
Posted: 2007/11/07 23:10 |
|
|
|
|
хорошо выложу... тока ногами не бейте сильно делал на спех, что получилось то получилось... возможно кто-то что-то дополнит, усовершенствует.
Вообще для чего нужен был метод клонирования: чтобы не выполнять один и тот же запрос два раза.
при клонировании возникали проблеммы с клонирование блоб и мемо полей. вот собственно говоря и возник вопрос, но все же сам разобрался.
function CloneDS(DataSet: TDataSet): TDataSet;
var
Temp:TADClientDataSet;
j : integer;
MyBuffer: PChar;
oMemory: TMemoryStream;
oMemoStr: String;
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-1 do
begin
if (DataSet.Fields[j].DataType=ftString) then
Temp.FieldDefs.Add(DataSet.Fields[j].FieldName, DataSet.Fields[j].DataType, DataSet.Fields[j].DataSize)
else
Temp.FieldDefs.Add(DataSet.Fields[j].FieldName, DataSet.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-1 do
begin
if not DataSet.Fields[j].IsBlob and not (DataSet.Fields[j].DataType = ftAutoInc) then
begin
GetMem(MyBuffer, DataSet.Fields[j].DataSize);
try
if DataSet.Fields[j].GetData(MyBuffer) then
Temp.Fields[j].SetData(MyBuffer);
finally
FreeMem(MyBuffer, DataSet.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=ftmemo) then
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
|
|