procedure TFHelpConfig.FormShow(Sender: TObject);
var Stream:TMemoryStream;
begin
try
try
with ADOQuery2 do
begin
Close;
SQL.Clear;
SQL.Add('select top 1 * from AceHelpIni Order by ModifyTime');
Open;
end;

Stream := TMemoryStream.Create;
TBlobField(ADOQuery2.FieldByName('Ini')).SaveToStream(Stream);
Stream.Position := 0;
Stream.SaveToFile('D:\aa.xml');
finally
Stream.Free;
end; self.ADOQuery1.LoadFromFile('D:\aa.xml');
except
ShowMessage('出错!');
end;
end;我数据库中Ini的内容为
<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'
xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'
xmlns:rs='urn:schemas-microsoft-com:rowset'
xmlns:z='#RowsetSchema'>
<s:Schema id='RowsetSchema'>
<s:ElementType name='row' content='eltOnly' rs:updatable='true'>
<s:AttributeType name='id' rs:number='1' rs:writeunknown='true' rs:basecatalog='AceStylePlatform' rs:basetable='AceHelpConfig'
 rs:basecolumn='id'>
<s:datatype dt:type='int' dt:maxLength='4' rs:precision='10' rs:fixedlength='true' rs:maybenull='false'/>
</s:AttributeType>
... ...
<s:AttributeType name='UserId' rs:number='2' rs:nullable='true' rs:writeunknown='true' rs:basecatalog='AceStylePlatform'
 rs:basetable='AceHelpConfig' rs:basecolumn='UserId'>
<s:datatype dt:type='int' dt:maxLength='4' rs:precision='10' rs:fixedlength='true'/>
</s:AttributeType>
<s:extends type='rs:rowbase'/>
</s:ElementType>
</s:Schema>
<rs:data>
<z:row id='562' UserId='1' ModuleId='7101' Seq='22' DisplayName='Shiplot_Re' Length='100' Selected='N' Fixed='Y'
 Condition='N' Range='N' MustInput='N'/>
 ... ...
<z:row id='563' UserId='1' ModuleId='7101' Seq='23' DisplayName='Lot' Length='100' Selected='N' Fixed='Y' Condition='N'
 Range='N' MustInput='N'/>
</rs:data>
</xml>但读到aa.xml中后打开看,最后的</xml>没有了,所以程序一直报:下列标记没有关闭:xml为什么数据库中有</xml>,但读到aa.xml中就没了?
如果没办法使数据库中内容全部读到aa.xml中,那怎么手动加一行</xml>到aa.xml中?请高人赐教。

解决方案 »

  1.   

    写aa.XML的代码没错,应该是你数据库中ini字段里的文本本来就没有</xml>。
    可能是你往数据库写时就没有写入。
      

  2.   


    数据库中有</xml>我在SQL中用print显示出来都有,最上面贴出来的就是从数据库中Copy出来的。我知道怎么手动在xml文档后加多"</xml>"了,但是怎么也不明白为什么读出来的跟数据库中的不一致.
      

  3.   

    匪夷所思,delphi7+SQLServer?
    要不把数据库备份一个上来给大家瞧瞧?
      

  4.   

    原因找到了,我数据库中Ini字段为text类型,并且其中包含中文(4个中文字),当ADOQuery读出来是只当中文字1位,所以读到流中正好少了4位(少了</xml>)。我将数据库中Ini字段改成ntext类型后,ADOQuery就能读出所有内容了,用TMemoryStream也能保存完整的内容到xml文档中,但是又有另外一个问题我的“self.ADOQuery1.LoadFromFile('D:\aa.xml'); ”这句报错:名称以无效字符开头。我看了一下生成的xml文件大小,
    用TMemoryStream的SaveToFile方法,
    读text类型生成的xml文件为8kb
    读ntext类型生成的xml文件为16kb用self.Memo1.Lines.Add(ADOQuery.FieldByName('Ini').AsString);
    self.Memo1.Lines.SaveToFile('D:\aa.xml');
    读ntext类型生成的xml文件为8kb3个文件内容是一样的。
    self.ADOQuery1.LoadFromFile('D:\aa.xml'); 只能Load大小为8kb的xml档,否则报错。请问是为什么生成的xml档大小不同?
    除了用Memo1控件有没有其他方法生成ADOQuery能Load的xml档?
    有没有方法从数据库中读出来Ini字段后直接放到ADOQuery中,不用生成中间的xml档?
    http://topic.csdn.net/u/20100128/17/dfc0f1e7-1c32-4409-abad-a354240c52ae.html如果解决可以再加分,望高人指点迷经。
      

  5.   

    widestring的大小是string的两倍。
    不用xml中转可以用CoStream,本论坛有。
      

  6.   

    先转换成String,再把String存入文件试试。数据库字段有可能使用了UTF16之类的双字节编码。
      

  7.   


    并不是String的长度不够,我数据库中Ini字段内容加长减短都一样少4位。Ini字段正好中有4个中文字,应该与编码有关。我试试CoStream,如果行的话,xml问题就不存了。
      

  8.   


    ShowMessage(ADOQuery.FieldByName('Ini').AsString)没有</xml>,ADOQuery读Ini字段时就没读出</xml>来,这样来看Stream应该没问题的。ShowMessage(ADOQuery.FieldByName('Ini').AsWideString)也没有</xml>
      

  9.   

    弱弱问一下,Ini字段是什么来的?Image?
      

  10.   


    Ini只是我的字段名而已,上面5楼时说了我设成text类型或ntext类型,ADOQuery读出来有不同结果。
      

  11.   


    CoStream在哪个单元中?
    _Stream是什么类型流?我很菜... :(