gpt4 book ai didi

c# - 具有空白元素的 XML 类型的 SQLParameter,是否丢失了空白?

转载 作者:太空宇宙 更新时间:2023-11-03 13:56:23 29 4
gpt4 key购买 nike

当我尝试使用 SQLParameter 存储到 XML 类型的列时,我遇到了问题。我正在创建 SqlDbType.Xml 的参数。似乎任何只有空白的 XML 元素都被转换为封闭元素。

这与

的行为相同
SELECT CAST('<Cust><Fname>Andrew</Fname><Lname> </Lname></Cust>' as XML) 
VS
SELECT CONVERT(xml, '<Cust><Fname>Andrew</Fname><Lname> </Lname></Cust>', 1)

我很惊讶地看到这是 SQLParameter 中的默认行为。有没有办法让 SqlDbType.Xml 的 SQLParameter 关心它的空白?作为在黑暗中拍摄的照片,我尝试将精度设置为 1,但这并没有帮助...

下面的代码在数据库中以这个结束

<Cust><Fname>Andrew</Fname><Lname /></Cust>

如您所见,它去除了空白 XML 元素

// CREATE TABLE T(c1 int primary key, c2 xml)
static void Main(string[] args) {

using (var Connection = new System.Data.SqlClient.SqlConnection("Data Source=localhost;Initial Catalog=Test;Integrated Security=SSPI;"))
{
Connection.Open();

using (var Command = Connection.CreateCommand())
{
Command.CommandText = "INSERT INTO T VALUES (1, @s)";

var XmlParameter = Command.Parameters.Add("s", System.Data.SqlDbType.Xml);
XmlParameter.Value = "<Cust><Fname>Andrew</Fname><Lname> </Lname></Cust>";

Command.ExecuteNonQuery();
}

Connection.Close();
}

有没有人知道解决这个问题的方法不是将参数解析为二进制并将其转换为插入/更新命令的一部分?

Command.CommandText = "INSERT INTO T VALUES (1, CONVERT(xml, @s, 1))";

如有任何帮助或反馈,我们将不胜感激。

最佳答案

如果您从外部源接收 XML,并且它只是从元素开始,您可以在字符串前加上前缀

<?xml version="1.0"?>
<!DOCTYPE Cust [
<!ATTLIST Cust xml:space (preserve) #FIXED 'preserve'>
]>

这应该使整个文档(Cust 根节点向下)保留空白。如果您只对特定字段感兴趣,那么不要使用 ATTLIST 表示 Cust,而是为每个要保留空格的元素添加一个新的 ATTLIST。例如

<!ATTLIST Fname xml:space (preserve) #FIXED 'preserve'>
<!ATTLIST Lname xml:space (preserve) #FIXED 'preserve'>

同样,我没有尝试使用 SQL 服务器(我只是无法访问它)但是 IE 和 Chrome 中的 XML 处理器按预期将 xml:space="preserve"添加到文档中上面说过给了你你正在寻找的行为。这种方法无需深入操作 XML 即可完成,您只需将一些处理指令添加到文档的开头即可。

关于c# - 具有空白元素的 XML 类型的 SQLParameter,是否丢失了空白?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12034982/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com