以下代码将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'<Range><Column Name="Id" Low="5002" High="8076" /></Range>'
该值是使用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)));
}