2013-10-28 61 views
1

,我發現了異常:錯誤Like運算符和轉義特殊字符

錯誤操作一樣:字符串模式「胡說[等等等等」是無效的。

它是存在的,其中我使用了一個DataTable的。選擇方法如下所示:

DataRow[] rows = table.Select("X Like '" + y + "'");

我從閱讀其他職位,由於懷疑,這是方括號看到。我讀過的文章說逃避方括號,但他們大多集中在問題的根源是硬編碼字符串開發人員可以輕鬆逃脫。

我正在從數據庫中讀取數據。我可以做一些事情,比如y.replace(「[」,「\ [」),我猜可以解決方括號問題。但後來我想知道,如果數據庫中的其他地方有一個帶*的字符串怎麼辦?

其他人如何處理?我可以通過轉義所有可能的非法字符來調用可以使字符串安全的東西嗎?或者是用逃逸的等價物手動替換它們的情況?

感謝 西蒙

+1

[參數化查詢](http://stackoverflow.com/q/5468425/464709)將解決此問題以及其他更嚴重的問題。 –

+0

好點,雖然我沒有完全解釋。數據先前已從Db中讀取(使用數據讀取器和填充域對象)。對於此特定任務(爲第三方圖表提供數據),它需要位於數據表中,以便在內存中構建數據表並從域對象屬性(通過幫助類)填充數據表。 select在這個過程中完成:它執行一個select來查看數據表中是否已經存在一個給定項的一行,每次遍歷該列表。是否有另一種方法來做更多參數化的選擇? – Kate

+0

我明白了。據我所知,沒有辦法將查詢參數傳遞給'DataTable.Select()'(這本身就足以避免像鼠疫恕我直言這樣的方法)。如果在填充DataTable之前不能使用DISTINCT或類似的方法消除重複項,那麼恐怕你確實會陷入不安全,有問題的連接。 –

回答

0

萬一別人遇到此,這裏是我去解決。迴應上述Frédéric的建議,Jon Skeets解決方案Escaping special character in string in C#也使用了DataTable.Select()之外的東西,所以我使用了他的LINQ建議。

但是,我也遇到了這個答案Correct way to escape characters in a DataTable Filter Expression這確實給了一些代碼,可以重新使用,如果你想實施一種逃避大多數可能的非法字符的方式。然而,因爲你不知道在所有條件下哪個角色可能是非法的,所以我首選一種不依賴這種技術的解決方案。