これを行う簡単な方法があります。
あなたが整数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
のデータパケットを定義METADATA
に追加FIELD
ノードを追加するために些細な変更を行うためにMSXMLたり、お気に入りのXMLプロセッサを使用することができます。その後、XMLからCDSをリロードします。追加されたフィールドの値はもちろんNULLになります。この手法を使用するには、保存されたXMLからリロードする際に、永続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に追加することもできます。
私は、XMLファイル内の各ROW
ノードの追加情報を含むようにCDSのXMLを変更しようとしたときに、このルーズを見つけました。 LoadFromFile
& LoadFromStream
のプロセスは、私が追加した情報を完全に忘れていたことが判明しました。
を追加するとき私の知る限り、それは、PS(それの値はデータセットのレコード内に格納されている)
をデータフィールドに似て振る舞うべきで、(クローズおよびデータセットを再度開く)データをリロードする必要はありませんこのヘルプあなたをい? http://stackoverflow.com/questions/21293186/delphi-change-fields-definitions-of-a-tclientdataset-that-has-data – Graymatter
ちょっと、ちょっと。それは私が思っている非常に奇妙に提起された質問ですか?とにかく、この回答http://stackoverflow.com/a/21295035/6620329私の質問の最後に "かすかな"ソリューションと呼ばれるものを説明します。多分それは私には利用可能な唯一のオプションです(バーMartynAの提案は、ディスク上のテキストファイルを編集することです)。 –