以下代码将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捕获该值。
如何删除&lt;的额外编码?和&gt;?
答案 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);
}