이 작업을 수행하는 간단한 방법이 있습니다.
당신이 정수 ID 필드와 문자열 (80) 이름 필드와 CDS를 가지고, 당신은 결과 XML 파일은 다음과 같이됩니다
AFileName := 'C:\Temp\CDSData.Xml';
CDS1.SaveToFile(AFileName, dfXML);
같이 XML로 데이터 집합을 저장하는 경우 (D7에 대한)
<?xml version="1.0" standalone="yes"?>
<DATAPACKET Version="2.0">
<METADATA>
<FIELDS>
<FIELD attrname="ID" fieldtype="i4"/>
<FIELD attrname="Name" fieldtype="string" WIDTH="80"/>
</FIELDS><PARAMS CHANGE_LOG="1 0 4"/>
</METADATA>
<ROWDATA>
<ROW RowState="4" ID="1" Name="one"/>
</ROWDATA>
</DATAPACKET>
그런 다음 추가 필드 (들)을 추가하려면 CCDS
의 datapacket을 정의하는 METADATA
에 추가 FIELD
노드를 추가 할 사소한 변화를 만들기 위해 MSXML 또는 좋아하는 XML 프로세서를 사용할 수 있습니다. 그런 다음 XML에서 CDS를 다시로드합니다. 추가 된 필드 값은 물론 NULL이며이 기법을 사용하려면 저장된 XML에서 CDS를 다시로드 할 때 영구 TField가 CDS에 정의되어 있지 않아야합니다.
예제 코드 : 분명히
procedure TForm1.CopyWithAddedFields;
var
SS : TStringStream;
XMLDoc : IXmlDomDocument;
FieldsNode : IXmlDomNode;
FieldElement : IXmlDomElement;
begin
SS := TStringStream.Create('');
try
// Save the CDS's current contents in XML format, close it and clear any presistent fields
CDS1.SaveToStream(SS, dfXML);
CDS1.Close;
CDS1.Fields.Clear;
// Next create an XML Document object and load the saved dataset into it
XMLDoc := CoDomDocument.Create;
XMLDoc.LoadXML(SS.DataString);
// Find the FIELDS node and add a new FIELD node to it
FieldsNode := XMLDoc.selectSingleNode('/DATAPACKET/METADATA/FIELDS');
FieldElement := XMLDoc.createElement('FIELD');
FieldElement.SetAttribute('attrname', 'Active');
FieldElement.SetAttribute('fieldtype', 'boolean');
FieldsNode.appendChild(FieldElement);
// Save the XML to the stream
SS.Size := 0;
SS.WriteString(XmlDoc.xml);
SS.Position := 0;
// Reload the ClientDataset
CDS1.LoadFromStream(SS);
finally
XMLDoc.Free;
SS.Free;
end;
end;
, 당신은 당신이 원한 아닌 경우 다른 CDS에 수정 된 XML을로드 할 수 있습니다.
물론 FIELD
개의 노드를 XML에 추가하는 것은 물론, 문자열 - twiddling을 일정량 수행 할 준비가 되었다면 TStringList에로드하여 추가 할 수도 있습니다.
Fwiw, 나는 XML 파일의 각 ROW
노드에 대한 추가 정보를 포함하도록 CDS의 XML을 수정하려고 할 때이 규칙을 발견했습니다. LoadFromFile
& LoadFromStream
개의 프로세스가 내가 추가 한 정보를 전혀 알지 못한다는 것이 밝혀졌습니다.
를 추가 할 때 (그것의 값이 데이터 집합 기록에 저장된다)
PS를 데이터 필드와 유사한 행동해야하고 데이터를 다시로드 (가까이와 데이터 집합을 다시) 할 필요가 없습니다 AFAIK이 도움말을 하는가하면 ? http://stackoverflow.com/questions/21293186/delphi-change-fields-definitions-of-a-tclientdataset-that-has-data – Graymatter
흠, 어쨌든. 내가 생각하기에 이상하게 제기 된 질문이다. 어쨌든,이 대답은 http://stackoverflow.com/a/21295035/6620329 내 질문의 끝에 "지저분한"솔루션이라고 언급 한 설명합니다.어쩌면 그게 나에게 사용 가능한 유일한 옵션 일 수도있다. (디스크상의 텍스트 파일 편집에 관한 Martyna의 제안). –