我有一个返回格式良好的Xml 字符串的方法。如何将此字符串转换为SqlXml?
答案 0 :(得分:13)
纯粹C#的另一种方式 - 为子孙后代:
using (var memoryStream = new MemoryStream())
{
using (var xmlWriter = XmlWriter.Create(memoryStream))
{
xmlWriter.WriteString(xmlData.ToString().Trim());
return new System.Data.SqlTypes.SqlXml(memoryStream);
}
}
答案 1 :(得分:7)
这是我的C#转换方法版本。
public static SqlXml ConvertString2SqlXml(string xmlData)
{
UTF8Encoding encoding = new UTF8Encoding();
MemoryStream m = new MemoryStream(encoding.GetBytes(xmlData));
return new SqlXml(m);
}
我不太喜欢它,因为我本来希望MemoryStream带有一个使用块,但这给了我:
无法访问已处置的对象。对象名称:'无效尝试呼叫 在关闭流时读取。'。
我愿意接受这个问题,因为此代码仅用于单元测试,我想用SqlXml参数测试SqlFunction,该参数将部署到SQL Server CLR。
由于以下问题,ReinhardtB的答案对我不起作用:
当用xmlData "<?xml version=\"1.0\" encoding=\"utf-8\"?><test></test>"
调用它时(反斜杠在C#字符串文字中),我得到了:
发生了System.InvalidOperationException Message = Token状态Start中的文本将导致XML文档无效。 确保将ConformanceLevel设置设置为 如果您愿意,可以使用ConformanceLevel.Fragment或ConformanceLevel.Auto 写一个XML片段。
通过以下修改很容易解决这个问题:
XmlWriterSettings settings = new XmlWriterSettings();
settings.ConformanceLevel = ConformanceLevel.Fragment;
using (var xmlWriter = XmlWriter.Create(memoryStream, settings))
但是,这导致了以下异常:
发生System.ObjectDisposedException消息=无法访问 处置对象。对象名称:'无效尝试调用时读 流已关闭。'。源= System.Data
这个,我可以通过省略MemoryStream的使用块(这当然是一个坏主意)来解决下一个问题:当检查SqlXml,SqlXml.Value的值时,我发现它包含值<?xml version="1.0" encoding="utf-8"?><test></test>
,即&lt;和&gt;已经逃脱了!这似乎是SqlXml
类型的严重问题。
答案 2 :(得分:5)
我知道这已经得到了解答,但这些答案似乎都不适合我。相反,我采用另一种方法使用这个oneliner
var sqlXml = new SqlXml(new XmlTextReader(new StringReader(stringToParseToSqlXml)));
然而,这是泄漏,但将其更改为:
using (var reader = new StringReader(stringToParseToSqlXml))
{
using (var xmlreader = new XmlTextReader(reader))
{
var sqlXml = new SqlXml(xmlreader);
// Do other stuff
}
}
我用过这个,它似乎对我有用。
答案 3 :(得分:3)
在SQL Server中,一个简单的:CAST(MyVarcharString AS xml)
或者将其分配给.net中的SQLDbType.Xml,例如参数
答案 4 :(得分:1)
如果设置正确的长度,SqlParameter可以正常工作。
comm.Parameters.Add("@XML_Field", SqlDbType.Xml, stringXml.Length)
comm.Prepare()
comm.Parameters("@XML_Field").Value = stringXml
如果你想在某些情况下设置DBNull.Value,则为-1:
comm.Parameters.Add("@XML_Field", SqlDbType.Xml, -1)
comm.Prepare()
comm.Parameters("@XML_Field").Value = DBNull.Value