下面代码目的想实现向TABLE.XML文件中写入一条记录:
ClientDataSetTable.LoadFromFile('c:\TABLE.xml');
ClientDataSetTable.Append;
ClientDataSetTable.FieldByName('ID').asinteger :=ID;
ClientDataSetTable.FieldByName('ID_DB').asinteger :=ID_DB;
ClientDataSetTable.FieldByName('TableName').asstring :=Trim(sTableName);
ClientDataSetTable.FieldByName('Caption').asstring :=Trim(sCaption);
ClientDataSetTable.Post;
ClientDataSetTable.SaveToFile(c:\Table.xml');
ClientDataSetTable.Close;
问题:这段程序在连续执行几十次后,系统就突然崩溃,更为可怕的是竟然将TABLE。XML文件清空了。大家想想办法救救我!
ClientDataSetTable.LoadFromFile('c:\TABLE.xml');
ClientDataSetTable.Append;
ClientDataSetTable.FieldByName('ID').asinteger :=ID;
ClientDataSetTable.FieldByName('ID_DB').asinteger :=ID_DB;
ClientDataSetTable.FieldByName('TableName').asstring :=Trim(sTableName);
ClientDataSetTable.FieldByName('Caption').asstring :=Trim(sCaption);
ClientDataSetTable.Post;
ClientDataSetTable.SaveToFile(c:\Table.xml');
ClientDataSetTable.Close;
问题:这段程序在连续执行几十次后,系统就突然崩溃,更为可怕的是竟然将TABLE。XML文件清空了。大家想想办法救救我!
ClientDataSetTable.SaveToFile(c:\Table.xml',dfXML);
begin
with ClientDataSet1 do
begin
FileName := 'C:\Table.xml';
Open;
Append;
FieldValues['ID'] := ID;
{...}
Post;
Close;
end;
end;
CLOSE就自動存...
您的方法会让.xml文件始终处于独占状态,不适合多用户操作!
不用SaveToFile、直接用文件名接好、追加後、CLOSE就自動存
您能否说详细!
1 硬盘空间不足?-----------回答:硬盘空间足够大
2 是否多线程并发操作?是否其他程序访问了该文件?--------就自己一个用户,因为我现在先测试
我得xml文件:
<?xml version="1.0" standalone="yes" ?>
- <DATAPACKET Version="2.0">
- <METADATA>
- <FIELDS>
<FIELD attrname="ID" fieldtype="i4" />
<FIELD attrname="ID_DB" fieldtype="i4" />
<FIELD attrname="TableName" fieldtype="string" WIDTH="50" />
<FIELD attrname="Caption" fieldtype="string" WIDTH="50" />
<FIELD attrname="Description" fieldtype="string" WIDTH="255" />
</FIELDS>
- <PARAMS LCID="0">
<PARAM Name="NO_RESET_CALL" Value="TRUE" Type="boolean" />
</PARAMS>
</METADATA>
- <ROWDATA>
<ROW ID="2" ID_DB="2" TableName="KF.GG_BANK" Caption="KF.GG_BANK" />
<ROW ID="3" ID_DB="2" TableName="KF.GG_BYQ" Caption="KF.GG_BYQ" />
<ROW ID="7" ID_DB="2" TableName="KF.YK_NY_TOTALREPORT" Caption="KF.YK_NY_TOTALREPORT" />
<ROW ID="8" ID_DB="7" TableName="nextitem.db" Caption="nextitem.db" />
<ROW ID="9" ID_DB="7" TableName="nextord.db" Caption="nextord.db" />
</ROWDATA>
</DATAPACKET>
xml文件及字段如上
参考下面的格式看看:
procedure CreateDataSet(ADODataSet: TCustomADODataSet; DataType:array of string; FieldName :array of string; AWidth :integer);
const
XMLRowDefine =
#13#10' <s:AttributeType name=''%s'' rs:number=''%d'' rs:nullable=''true'' rs:writeunknown=''true''>' +
#13#10' <s:datatype dt:type=''%s'' dt:maxLength=''%d'' rs:precision=''10''/>' +
#13#10' </s:AttributeType>';
var
XMLData:TStringList;
i:integer;
fname:string; XML :string;
Width :integer;
begin
fname := FormatDateTime('\yyyymmddhhnnsszzz', Now);
XMLData := TStringList.Create; XML := '';
FOR I:=0 to High(Datatype) do
begin
if DataType[i] = 'string' then Width := AWidth
else
Width := 8;
XML := XML + Format(XMLRowDefine, [IntToStr(i), i+1, DataType[i], Width]);
end; XMLData.Text :=
#13#10'<xml xmlns:s=''uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882''' +
#13#10' xmlns:dt=''uuid:C2F41010-65B3-11d1-A29F-00AA00C14882''' +
#13#10' xmlns:rs=''urn:schemas-microsoft-com:rowset''' +
#13#10' xmlns:z=''#RowsetSchema''>' +
#13#10'<s:Schema id=''RowsetSchema''>' +
#13#10' <s:ElementType name=''row'' content=''eltOnly'' rs:updatable=''true''>' +
XML +
#13#10' <s:extends type=''rs:rowbase''/>' +
#13#10' </s:ElementType>' +
#13#10'</s:Schema>' +
#13#10'<rs:data>' +
#13#10'</rs:data>' +
#13#10'</xml>';
XMLData.SaveToFile(fname);
end;
ClientDataSetTable.LoadFromFile('c:\TABLE.xml');
后又
ClientDataSetTable.SaveToFile(c:\Table.xml');
当然是数据被使用