如何将字符串转换为SqlXml

时间:2011-01-31 18:29:20

标签: c# sql-server-2008 .net-2.0

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

5 个答案:

答案 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的值时,我发现它包含值&lt;?xml version="1.0" encoding="utf-8"?&gt;&lt;test&gt;&lt;/test&gt;,即&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