分配给SqlXml参数的XML是否被额外编码?

时间:2017-09-19 02:19:22

标签: c# sql-server xml ado.net

以下代码将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捕获该值。

如何删除&lt;的额外编码?和&gt;?

2 个答案:

答案 0 :(得分:2)

请勿使用XmlWriter.WriteString。此方法的目的是将纯文本内容添加到元素中,因此该方法将替换&amp; &lt; &gt; 字符&amp; amp; &amp; lt; &amp; gt;

要将字符串视为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)));
}

答案 1 :(得分:1)

构建字符串的安全方法是使用编码,例如:

public static SqlXml GetXml(string s)
{
    var encoding = new UTF8Encoding();
    var memoryStream = new MemoryStream(encoding.GetBytes(s));
    return new SqlXml(memoryStream);
}