Как привести строку в 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