我正在尝试将一些数据存储在 XML 类型的列中,当数据是字符串时,它将保留确切的文本,而不是替换或调整嵌入的行尾,特别是 CR 和 LF。
因此,像 "A\r\nB\rC\nD" 这样的 C# 字符串需要完全返回,但似乎 XML 转换坚持用 LF 替换那些行尾,这实际上破坏了数据。我知道为什么在读取 Xml 文件等时会发生这种规范化,但这不是文件并且空格很重要。
我试过 CONVERT(xml, N'', 1);
我尝试将 xml:space="preserve" 作为属性添加到包含数据的元素中。
我试过使用 & # x D ; 代替 CR
背景:
我正在检查字符串的内容,CONVERT(varbinary(max), Value)
然后将输出复制到 TextPad 中,这样我就可以找到并查看到底存储了哪些字符。
我有理由确定数据正在以未更改的结尾到达 SQL Server(我使用 XmlWriter 设置,NewLineHandling = NewLineHandling.None
并且 LLBLGen 将数据视为字符串)但不确定,因为复制和粘贴会更改结尾,因此我无法检查它们。
Xml 序列化代码基本上是包装一个字典
void IXmlSerializable.WriteXml(XmlWriter writer)
{
var list = new List<Entry>(Values.Count);
foreach (var entry in Values)
{
list.Add(new Entry(entry.Key, entry.Value));
}
MementoXmlSerializer.Serialize(writer, list);
}
[XmlType("Entry")]
public struct Entry
{
public Entry(string key, object value): this()
{
Key = key;
Value = value;
}
[XmlAttribute("key")]
public string Key { get; set; }
[XmlElement("Value")]
public object Value { get; set; }
}
其中 MementoSerializer 定义为:-
static readonly Type[] AdditionalTypes =
{
typeof(int[]),
typeof(string[])
};
static readonly XmlSerializer MementoXmlSerializer = new XmlSerializer(typeof(List<Entry>), null, AdditionalTypes, new XmlRootAttribute("Entries"), null);
LLBLGen 使用并在 Sql Server Profiler 中看到的模式如下所示:-
declare @p3 xml
set @p3=convert(xml,N'<Entries xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><Entry key="FirmName"><Value xsi:type="xsd:string">A
B
C
D</Value></Entry></Entries>')
exec sp_executesql N'UPDATE [TIPS].[dbo].[Memento] SET [Value]=@p1 WHERE ( [TIPS].[dbo].[Memento].[ID] = @p2)',N'@p1 xml,@p2 int',@p1=@p3,@p2=4
任何帮助表示赞赏。