关于嵌套ClientDataSet的问题,
我遇到一个关于嵌套的ClientDataSet的问题,至今也弄不明白错在哪里,
请各位同行朋友们帮忙看看好吗?谢谢,能解决问题,分一定给的
我编了一个重现错误的Console小程序,如下:
program TestNestedCDS;
{$APPTYPE CONSOLE}
uses
SysUtils, Classes, DB, DBClient;
const
XMLText =
'<?xml version="1.0" standalone="yes" ?>' + sLineBreak +
'<DATAPACKET Version="2.0">' + sLineBreak +
' <METADATA>' + sLineBreak +
' <FIELDS>' + sLineBreak +
' <FIELD attrname="t1" fieldtype="nested">' + sLineBreak +
' <FIELDS>' + sLineBreak +
' <FIELD attrname="f1" fieldtype="string" WIDTH="10" />' + sLineBreak +
' </FIELDS>' + sLineBreak +
' <PARAMS />' + sLineBreak +
' </FIELD>' + sLineBreak +
' </FIELDS>' + sLineBreak +
' <PARAMS />' + sLineBreak +
' </METADATA>' + sLineBreak +
' <ROWDATA></ROWDATA>' + sLineBreak +
'</DATAPACKET>';
XMLFileName = 'NestedCDS.xml';
var
L: Integer;
CDSMaster,
CDSDetail: TClientDataSet;
Stream: TMemoryStream;
begin
Stream := TMemoryStream.Create();
try
L := Length(XMLText);
Stream.SetSize(L);
Move(XMLText[1], Stream.Memory^, L);
Stream.SaveToFile(XMLFileName);
finally
Stream.Free;
end;
CDSMaster := TClientDataSet.Create(nil);
CDSDetail := TClientDataSet.Create(CDSMaster);
try
CDSMaster.LoadFromFile(XMLFileName);
CDSDetail.DataSetField := TDataSetField(CDSMaster.FieldByName('t1'));
except
CDSMaster.Free;
raise;
end;
try
CDSDetail.Insert;
CDSDetail.FieldByName('f1').AsString := 'Test';
CDSDetail.Post;
WriteLn('1 - Success');
except
on E: Exception do WriteLn('1 - Error: ' + E.Message);
end;
try
CDSDetail.Cancel;
CDSDetail.Insert;
CDSDetail.FieldByName('f1').AsString := 'Test';
CDSDetail.Post;
WriteLn('2 - Success');
except
on E: Exception do WriteLn('2 - Error: ' + E.Message);
end;
CDSMaster.Free;
WriteLn('Press enter...');
Readln;
end.