插入XML数据SQL Server - 编码问题

时间:2011-09-29 10:10:10

标签: .net sql-server xml encoding

我在将一些数据插入数据库之前对其进行序列化。

Dim insertString As String = "INSERT INTO GP_SELECTION(SOCIETE, NAME, OBJECT_TYPE, DATA) VALUES ('{0}','{1}',{2},'{3}')"
Dim xmlData As String = .XmlFromFilters()
insertString = String.Format(insertString, societe, .Name, CInt(.ObjectType), xmlData)

现在,当我进行插入时,sql就像

INSERT INTO GP_SELECTION(SOCIETE, NAME, OBJECT_TYPE, DATA) VALUES ('01','hello world!!!',0,
'<?xml version="1.0" encoding="utf-16"?>
<ArrayOfPropertyFilter xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <PropertyFilter>
    <AndOr>SOME DATA</AndOr>
    <Value xsi:type="xsd:string" />
  </PropertyFilter>
</ArrayOfPropertyFilter>')

并且SQl服务器给了我:

  

XML解析:第1行,第38个字符,无法切换编码

我想知道如何避免它...我应该转换Unicode(UTF)insertString吗?怎么样?或者我可能应该使用SQL方法进行转换?

也许一个解决方案是从序列化字符串中删除“encoding="utf-16"”(然后插入工作没有问题)......?

PS。为防止异常注释,实际上,我不使用存储过程,而是使用直接INSERT代码。我知道这不是最好的方法,但是这是我现在的选择。

1 个答案:

答案 0 :(得分:0)

我不知道为什么会有所不同:-)但是如果你将XML转换为NVARCHAR(MAX)然后再转回XML它似乎有用(至少在我的测试用例中):

DECLARE @tmp TABLE (ID INT, XmlCol XML)

INSERT INTO @tmp 
VALUES (1, CAST(CAST('<?xml version="1.0" encoding="utf-16"?>
                      <ArrayOfPropertyFilter xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
                         <PropertyFilter>
                              <AndOr>SOME DATA</AndOr>
                              <Value xsi:type="xsd:string" />
                         </PropertyFilter>
                      </ArrayOfPropertyFilter>' AS NVARCHAR(MAX)) AS XML))

你的更大问题是你的方法对SQL注入是开放的 - 你应该使用参数化查询而不是将你的SQL语句连接在一起作为字符串!

使用类似:

INSERT INTO GP_SELECTION(SOCIETE, NAME, OBJECT_TYPE, DATA) 
VALUES (@Societe, @Name, @ObjectType, @Data)

然后为查询定义SQL参数并填充值。更安全!!