Delphi D6中如何从Kamiak ADO Query组件读取FOR XML RAW返回的XML?
解决Delphi 6中Kamiak ADO Query执行FOR XML RAW后的XML读取问题
针对你遇到的两个问题,我整理了具体的解决方案和原因分析:
问题1:FieldByName()找不到可用字段名
当执行FOR XML RAW语句时,SQL Server默认不会给返回的XML结果设置友好列名,而是生成一个固定的GUID格式列名:XML_F52E2B61-18A1-11d1-B105-00805F49916B。你可以直接用这个字段名调用FieldByName,或者更友好的方式是在SQL语句里给结果起别名:
-- 给XML结果设置别名XmlResult,方便后续调用FieldByName('XmlResult') SELECT * FROM YourTargetTable FOR XML RAW, ROOT('Root') AS XmlResult
修改后就能通过Query.FieldByName('XmlResult')正常访问该字段了。
问题2:Fields[0]返回二进制无法被XMLPartner.LoadFromMemory()读取
Kamiak ADO Query返回的二进制数据其实是UTF-16LE编码的XML内容(SQL Server默认以Unicode格式返回XML结果),而LoadFromMemory()通常期望UTF-8编码的字节流或字符串。你可以把二进制数据转换成WideString,再交给XMLPartner处理,代码示例如下:
var XmlBinData: TBytes; XmlWideStr: WideString; begin // 获取二进制字段内容 XmlBinData := Query.Fields[0].AsBytes; // 将UTF-16LE的二进制数据转换为WideString if Length(XmlBinData) > 0 then SetString(XmlWideStr, PWideChar(@XmlBinData[0]), Length(XmlBinData) div SizeOf(WideChar)); // 直接用XMLPartner的LoadFromString方法加载(如果支持WideString) XmlPartner.LoadFromString(XmlWideStr); // 如果XMLPartner只支持UTF-8字节流,可再把WideString转成UTF-8: // var // XmlUtf8Bytes: TBytes; // begin // XmlUtf8Bytes := TEncoding.UTF8.GetBytes(XmlWideStr); // XmlPartner.LoadFromMemory(XmlUtf8Bytes[0], Length(XmlUtf8Bytes)); // end; end;
额外提示
如果不想处理二进制转换,也可以尝试在SQL语句中添加TYPE关键字,让SQL Server返回XML类型,再通过AsString直接获取字符串:
SELECT * FROM YourTargetTable FOR XML RAW, TYPE AS XmlResult
之后直接调用Query.FieldByName('XmlResult').AsString就能拿到XML字符串,再传给XMLPartner加载即可。
内容的提问来源于stack exchange,提问作者TheGDog
相关产品推荐
相关产品推荐

