2011-09-29 29 views
0

我在將數據插入數據庫之前序列化一些數據。插入XML數據SQL Server - 編碼問題

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 Server給我:

XML分析:行1,字符38,無法切換編碼

我想呃如何避免它...我應該轉換Unicode(UTF)insertString?怎麼樣?或者,也許我應該使用SQL方法進行轉換?

也許解決方案將從序列化的字符串中刪除「encoding="utf-16"」(然後插入工作沒有問題)......?

PS。爲了防止不尋常的註釋,實際上,我不使用存儲過程,而是使用直接的INSERT代碼。我承認這不是最好的方式,但是這是我現在的選擇。

+0

對不起 - 我的近距離投票是不必要的 - 你的問題與我的有點不同...... –

+0

什麼是SQL Server版本? –

+0

SQL Server 2005 – serhio

回答

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參數爲您的查詢,並填寫那些值。更安全!