我在将一些数据插入数据库之前对其进行序列化。
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代码。我知道这不是最好的方法,但是这是我现在的选择。
答案 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参数并填充值。更安全!!