2014-01-15 90 views
1

我見過這麼多的解決方案,我不知道要遵循哪一個。 我以爲我有什麼工作,但進一步測試後,我發現這是不正確的。 我使用VB從給定文件目錄中提取MS Excel工作表,提取數據並插入到SQL數據表中。在SQL中插入包含單引號的字符串

這裏是我需要一些幫助部分:

If saRet(linex, 11) <> "" Then 
IntDesc = (saRet(linex, 11).ToString.Replace("'", "''")) 
Echo("Internal description: " & IntDesc) 
     Else 
      Echo("No internal description given") 
      IntDesc = "" 
End If 

與SQL服務器工作室的一些測試INSERT語句周圍篡改後,我認爲,'與'替換工作。可悲的是,沒有。

這裏是一個字符串,它使插入的例子失敗:

Set-up and Config of New Button on BP and UDF's for Despatch Process 

和我的字符串操作後,這裏的Insert語句(我已經空白了一些數據,我公司可能不希望無論如何,這是微不足道的):

NSERT INTO <tablename> VALUES ('2013-12-10', '12', '2013', 'AAAA', 'AAAA', '10668', 'JBT', 'Project - Config & System Build', 'CSB', '2', 'Y', 'N', '0', 'Set-up and Config of New Button on BP and UDF's for Despatch Process', 'Set-up and Config of New Button on BP and UDF''s for Despatch Process', '0', 'NULL') 

非常感謝任何幫助! 謝謝。

+0

http://msdn.microsoft.com/zh-cn/library/system.data.sqlclient.sqlparameter(v=vs.110).aspx –

+0

SQL標記不適用於SQL Server。這個問題與VB6,Excel或VB.Net無關。標籤很差。 – Bob77

+0

@ Bob77考慮到它提供的示例中的VB代碼,並且有些在VB中編寫類似EXCEL提取代碼的人可能會遇到同樣的問題,我認爲這些標記是合適的。祝賀我們浪費時間和這個評論。 – Cal

回答

2

最好的方法是始終使用參數。那些處理你的一切,你不需要做任何逃避。

如果你不能使用參數,你必須自己做編碼,這非常棘手。一種方法是使用可以安全編碼的格式 - 例如,您可以使用二進制編碼(例如,cast(0xAABBCCDD as varchar(max))),而不是將其作爲字符串文字插入。這是非常安全的,因爲你可以確定沒有無效的字符會破壞它。當然,它也有它的問題。

至於你的例子,用''代替'工作正常(當然,你必須注意其他無效字符,如endlines)。你的問題是你沒有對這個字符串全部做編碼。在你的示例中,最後一個字符串具有正確的編碼,而不是前一個。這也很好地說明了確保編碼正確的痛苦 - 而且你錯過的任何事情都意味着錯誤,甚至是利用代碼造成傷害的一種方式。例如,如果描述是', ''0'', ''NULL''); delete from users --

+0

感謝隊友,我會在這裏查看一些文檔。你提到二進制編碼,然後提供了一個看起來像Hex的例子? – Cal

+1

@Cal是的,我用十六進制表示它,但它是一個二進制文字。不要糾纏於此,它只是命名。只需逐個字符(如果沒有簡單的方法)並將其從char轉換爲字節,然後以2位十六進制(例如,在C#中使用byte.ToString(「X2」))編寫。 – Luaan

相關問題