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

修改SqlCommand.ExecuteXmlReader生成的XmlReader的CheckCharacters属性无效,该如何解决?

问题分析与解决方法

你遇到的问题是:通过XmlReader.Create包装已有XmlReader并设置CheckCharacters = false后,reader.Settings.CheckCharacters仍为true。原因在于当用XmlReader.Create包装已存在的XmlReader实例时,传入的XmlReaderSettings中的CheckCharacters设置无法覆盖底层读取器的字符检查行为——底层读取器(即ExecuteXmlReader返回的实例)已经在执行字符检查,包装后的读取器仅作为代理传递操作,不会重新修改字符检查的配置。

正确实现方式

要真正禁用字符检查,需直接从数据源(而非已有的XmlReader)创建新的XmlReader,具体步骤如下:

  1. 将SQL命令执行的XML结果读取为内存流;
  2. 基于该流,使用配置好CheckCharacters = false的XmlReaderSettings创建新读取器。

示例代码:

using (var ms = new MemoryStream())
{
    // 将ExecuteXmlReader的结果写入内存流
    using (var readerOrg = command.ExecuteXmlReader())
    {
        var xmlContent = readerOrg.ReadOuterXml();
        var writer = new StreamWriter(ms);
        writer.Write(xmlContent);
        writer.Flush();
        ms.Position = 0; // 重置流位置到起始处
    }

    // 使用XmlReaderSettings创建新的读取器
    var settings = new XmlReaderSettings 
    { 
        CheckCharacters = false, 
        ConformanceLevel = ConformanceLevel.Auto 
    };
    using (var reader = XmlReader.Create(ms, settings))
    {
        reader.Read();
        // 验证设置是否生效
        Console.WriteLine(reader.Settings.CheckCharacters); // 输出 false
    }
}

补充说明

官方文档中提到的“为现有XML读取器添加功能”,指的是添加验证、命名空间支持这类额外扩展功能,而非修改底层读取器已绑定数据读取流程的核心行为(比如字符检查)。对于字符检查这类设置,必须在读取数据的源头(流或文本)创建读取器时配置,才能真正生效。

内容的提问来源于stack exchange,提问作者Kvasi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 02:36:18