You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:12:23