以下代码将XML参数传递给存储过程。 SqlXml是从字符串转换的。

var range = GetXml("<Range><Column Name=\"Id\" Low=\"5002\" High=\"8076\" /></Range>");
cmd.Parameters.Add(new SqlParameter("@Range", SqlDbType.Xml) { Value = range });

SqlXml GetXml(string s)
{
    var memoryStream = new MemoryStream();
    var settings = new XmlWriterSettings();
    settings.OmitXmlDeclaration = true;
    settings.ConformanceLevel = ConformanceLevel.Fragment;

    using (var xmlWriter = XmlWriter.Create(memoryStream, settings))
    {
        xmlWriter.WriteString(s);
        return new SqlXml(memoryStream);
    }
}


但是,事实证明传递给存储过程的实际XML值是

N'&lt;Range&gt;&lt;Column Name="Id" Low="5002" High="8076" /&gt;&lt;/Range&gt;'


该值是使用SQL Server Profiler捕获的。

如何删除的额外编码?

最佳答案

不要使用XmlWriter.WriteString。此方法的目的是向元素添加纯文本内容,因此该方法将&,字符替换为&,。

要将字符串视为XML而不是纯文本,可以从字符串创建XmlReader,然后将XmlReader传递给SqlXml(XmlReader) constructor

// using System.Data.SqlTypes;
// using System.IO;
// using System.Xml;

static SqlXml GetXml(string s)
{
    return new SqlXml(XmlReader.Create(new StringReader(s)));
}

07-26 09:29