2012-08-14 46 views
0

我正在處理一個綁定到訪問數據庫的C#表單應用程序。部分數據庫超出了我的控制範圍,特別是包含",),等字符串的部分。不用說,這是扼殺了一些查詢,因爲我需要使用該列來選擇其他數據。這只是一個桌面表單應用程序,問題在於導出函數,所以不用擔心SQL注入或其他類似的問題。當我使用一個可能包含它們的變量並將其與存儲在Access數據庫中的變量相匹配時,我該如何告訴這件事在查詢中忽略引號和類似內容?從變量轉義C#中的各種字符

那麼,一個例子是我從單行中提取了幾列。其中一人可能是這樣的:我目前使用的OleDb挖掘到數據庫

大(3-1/16" 直徑)

你的想法的報價是打破了查詢,直到現在我還沒有問題,我寧願不要直到目前我所做的事情能夠得到幫助,至少在我準備好正確的重構之前。

+0

完全不清楚。嘗試給出一些例子,說明它是如何被遺忘的以及你期望它做什麼 – Hogan 2012-08-14 00:17:39

+2

**使用參數**。 – SLaks 2012-08-14 00:20:15

+0

或更好的是,使用一個ORM來爲你處理它(即LINQ to SQL)。 – Adam 2012-08-14 00:27:50

回答

0

至少對於單引號,增加另一個報價似乎工作:''變成'

即使注射不應該是一個問題,我仍然會考慮使用parameters。他們在一天結束時是更簡單的選擇,因爲他們避免了一些無法預料的問題,注射只是其中之一。

3

這實際上並不像您可能看到的那樣是一個大問題:只是不要通過將它們構建爲純字符串來處理SQL查詢。使用SqlCommand類並使用查詢參數。這樣,SQL引擎將爲您正確地轉義所有內容,因爲它會知道什麼是要直接讀取的代碼,以及該參數的值是要轉義的。

0

所以當我讀了你的問題,你正在建設一個查詢在C#中的字符串,串聯已經查詢列的值,並且生成的字符串要麼不再是在C#中的字符串,也贏得了在訪問數據庫中不匹配的東西。

如果問題出在C#中,我想你需要某種避開功能像

stringvar += escaped(columnvalue) 
... 
private static void escaped(string cv) as string { 
    //code to put \ in front of problem characters in cv 
} 

如果問題是訪問,然後

「逃脫」 「逃逸」

&你可以把含有「內部的列值‘...’,它應該工作。

但是我再al想到的是,你試圖運行的SQL可能會被更好地重構爲使用子查詢來獲得匹配的值,然後你只是將列名與列名進行比較。

如果您發佈了更多關於您正在生成的查詢以及某些表結構的提示的更多信息,我會嘗試進一步幫助 - 或者其他人一定能夠給您一些建設性的東西(儘管您可能需要根據Jet SQL語法對其進行調整)