带有空格元素的XML类型的SQLParameter丢失了空格?

时间:2012-08-20 09:13:50

标签: c# xml tsql ado.net sqlparameters

当我尝试使用一个存储到XML类型的列时,我遇到了SQLParameter的问题。我正在创建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))";

非常感谢任何帮助或反馈。

1 个答案:

答案 0 :(得分: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即可实现,您只需在文档的开头添加一些处理指令。