如何将字符串转换为SqlXml

Ton*_*nyP 10 c# sql-server-2008 .net-2.0

我有一个方法返回一个格式良好的Xml 字符串.如何将此字符串转换为SqlXml?

小智 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);
    }
}
Run Code Online (Sandbox Code Playgroud)


R. *_*urs 7

这是我的C#转换方法版本.

public static SqlXml ConvertString2SqlXml(string xmlData)
{
    UTF8Encoding encoding = new UTF8Encoding();
    MemoryStream m = new MemoryStream(encoding.GetBytes(xmlData));
    return new SqlXml(m);
}
Run Code Online (Sandbox Code Playgroud)

我不太喜欢它,因为我本来希望MemoryStream有一个使用块,但这给了我:

无法访问已处置的对象.对象名称:'关闭流时无效尝试调用Read.'.

我愿意接受这个问题,因为这个代码只用于单元测试,我想用SqlXml参数测试一个SqlFunction,它将被部署到SQL Server CLR.

由于以下问题,ReinhardtB的答案对我不起作用:当用xmlData调用它时"<?xml version=\"1.0\" encoding=\"utf-8\"?><test></test>"(反斜杠在C#字符串文字中),我得到:

System.InvalidOperationException发生Message = Token文本处于Start状态会导致XML文档无效.如果要编写XML片段,请确保将ConformanceLevel设置设置为ConformanceLevel.Fragment或ConformanceLevel.Auto.

通过以下修改可以轻松解决此问题:

XmlWriterSettings settings = new XmlWriterSettings();
settings.ConformanceLevel = ConformanceLevel.Fragment;
using (var xmlWriter = XmlWriter.Create(memoryStream, settings))
Run Code Online (Sandbox Code Playgroud)

但是,这导致了以下异常:

发生System.ObjectDisposedException Message =无法访问已处置的对象.对象名称:'关闭流时无效尝试调用Read.'.来源= System.Data

这个,我可以通过省略MemoryStream的使用块(这当然是一个坏主意)来解决下一个问题:当检查SqlXml,SqlXml.Value的值时,我发现它包含值&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;test&gt;&lt;/test&gt;,也就是说,<和>已被逃脱!这看起来像是SqlXml类型的严重问题.


And*_*snk 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
    }
}
Run Code Online (Sandbox Code Playgroud)

我用过这个,它似乎对我有用.


gbn*_*gbn 3

在 SQL Server 中,一个简单的:CAST(MyVarcharString AS xml)

或者将其分配给.net 中的SQLDbType.Xml作为参数