Как привести строку в SqlXml

У меня есть метод, который возвращает хорошо сформированный Xml строка. Как привести эту строку в SqlXml ?

5 ответов


в SQL Server просто:CAST(MyVarcharString AS xml)

и назначить значения sqldbtype.В XML в .net как, скажем, параметр


другой способ в "чистом" C# - для потомков:

using (var memoryStream = new MemoryStream())
{
    using (var xmlWriter = XmlWriter.Create(memoryStream))
    {
        xmlWriter.WriteString(xmlData.ToString().Trim());
        return new System.Data.SqlTypes.SqlXml(memoryStream);
    }
}

Это моя версия метода преобразования c#.

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

Я не совсем доволен этим, потому что я хотел бы иметь MemoryStream с использованием блока, но это дало мне:

не удается получить доступ к ликвидированному объекту. Имя объекта: 'недопустимая попытка вызова Читайте, когда поток закрыт.'.

Я готов принять эту проблему, потому что этот код используется только в модульных тестах, где я хочу протестировать SqlFunction с SqlXml параметр, который будет развернут в среде CLR SQL Server.

ответ ReinhardtB не работал для меня из-за следующих проблем: При вызове этого с помощью xmlData "<?xml version=\"1.0\" encoding=\"utf-8\"?><test></test>" (задние косые черты находятся в строковом литерале C#), я получил:


Я знаю, что на это был ответ, но ни один из ответов, казалось, не работал для меня. Вместо этого я взял другой подход, используя этот проявляющаяся

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
    }
}

я использовал это, и, похоже, это работает для меня.


SqlParameter отлично работает, если вы установили правильную длину.

comm.Parameters.Add("@XML_Field", SqlDbType.Xml, stringXml.Length)
comm.Prepare()
comm.Parameters("@XML_Field").Value = stringXml

и -1, Если вы хотите установить DBNull.Значение в некоторых случаях:

comm.Parameters.Add("@XML_Field", SqlDbType.Xml, -1)
comm.Prepare()
comm.Parameters("@XML_Field").Value = DBNull.Value