2010-10-20 70 views
22

我正在使用OData來查詢我的數據庫。當「adapterName」只包含文本時,以下代碼行可以正常工作。如何轉義在OData查詢中使用的單引號?

ds.query('/DataAdapters?$filter=Name eq \'' + adapterName + '\'', ifmgr_CreateAdapter_Step1, onGenericFailure, ''); 

如果「adapterName」包含單引號,則失敗。我嘗試使用以下代碼轉義單引號:

adapterName = adapterName.replace(/\'/g, '\\\''); 

雖然這正確地轉義了用戶定義的文本,但函數仍然失敗。任何人都可以告訴我查詢中文本的正確格式是什麼?

+0

固定:)我需要將單引號轉換爲雙引號。 – Retrocoder 2010-10-20 15:17:50

+0

要注意:如果您使用子字符串過濾器並且查詢已經在引號內,您將需要用4'不是2來轉義。 – chapmatic 2016-03-04 20:23:13

回答

72

其實%27不是解決方案。正確的轉義方法是將兩個單引號放入字符串中,而不是一個。 在示例"o''clock"

+6

+1。用\'或%27代替'似乎不適用於odata查詢。這應該是被接受的答案。 – Mathieu 2012-02-06 20:23:38

+1

我完全同意,由於請求路徑中的字符無效,%27給出了400個錯誤的請求。 – jwendl 2012-03-27 21:09:41

+0

這裏的同行壓力,這個解決方案有效,%27拋出錯誤。 – 2013-03-08 23:01:07

0

當使用機智substringof它需要由具有代替1-撇號4被轉義:

a'b -> $filter=(substringof('a''''b', FirstName))

+0

這是對答案的評論,而不是答案 – sehe 2014-01-04 13:31:10

-1

代替使用$濾波器=標題當量「文本」

我的我正在使用oData startswith()函數。

$濾波器= startswith(標題,密鑰)

,然後我在儘可能多的密鑰的傳遞,我可以。

var pos = key.indexOf("'");
if(pos > -1) {
key = key.substring(0, pos);
}

5

我想了辦法,擴大了一點,所以它也適用於調用OData服務操作動作。發佈答案的答案是正確的,但是存在服務操作的參數必須編碼的特定順序。

ODATA服務操作,其中接收的字符串被封閉在原語類型參數的「使得有效的URL(預編碼)將是這樣

AddStringα值=」時許」

這將導致服務器看

AddStringα值= 'O'

'時鐘'

將產生「錯誤請求 - 查詢語法錯誤」。

要解決此問題,您必須在插入到網址之前雙重轉義'和UrlEncode。

不要UrlEncode url本身。

這是一個可以工作的例子。

// value passed as "o'clock" 
public async Task AddString(string value) 
{ 
    // Escape ' with '' and UrlEncode value 
    value = HttpUtility.UrlEncode(value.Replace("'", "''")); 

    string url = String.Format("AddString?value='{0}'", value); 

    // No need to UrlEncode url here as dynamic content has already been escaped 

    // Execute ..... 
} 

[WebGet] 
public void AddString(string value) 
{ 
    // here value will be "o'clock" 
} 
相關問題