2010-10-20 29 views
22

Tôi đang sử dụng OData để truy vấn cơ sở dữ liệu của mình. Dòng mã sau hoạt động tốt khi “adapterName” chỉ chứa văn bản.Làm thế nào để thoát khỏi một báo giá duy nhất được sử dụng trong một truy vấn OData?

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

Nếu “adapterName” chứa một dấu trích dẫn không thành công. Tôi đã cố gắng thoát khỏi dấu nháy đơn bằng cách sử dụng đoạn mã sau:

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

Mặc dù đây thoát một cách chính xác người dùng định nghĩa văn bản chức năng vẫn bị lỗi. Bất cứ ai có thể cho tôi biết định dạng đúng cho văn bản trong truy vấn là gì?

+0

CỐ ĐỊNH :) Tôi cần chuyển đổi báo giá đơn thành dấu ngoặc kép. – Retrocoder

+0

Để lưu ý: nếu bạn sử dụng bộ lọc chuỗi con và truy vấn đã nằm trong dấu ngoặc kép, bạn sẽ cần phải thoát với 4 'không 2. – chapmatic

Trả lời

72

Thực ra% 27 không phải là giải pháp. Cách đúng để thoát là đặt hai dấu nháy đơn vào chuỗi thay vì một. Trong ví dụ "o''clock"

+6

+1. Thay thế 'bằng \' hoặc% 27 dường như không hoạt động với truy vấn odata. Đây sẽ là câu trả lời được chấp nhận. – Mathieu

+1

Tôi hoàn toàn đồng ý,% 27 cho 400 yêu cầu không hợp lệ vì các ký tự không hợp lệ trong đường dẫn yêu cầu. – jwendl

+0

Áp lực ngang hàng ở đây, giải pháp này hoạt động,% 27 ném lỗi. –

0

Khi sử dụng wit substringof nó cần phải được thoát bằng cách có 4 thay vì 1 dấu nháy đơn:

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

+0

Đây là nhận xét tại câu trả lời, không phải là câu trả lời – sehe

-1

Thay vì sử dụng $ filter = Tiêu đề eq 'text'

tôi đang sử dụng hàm oData startswith().

$ filter = startswith (Tiêu đề, key)

và sau đó tôi vượt qua trong càng nhiều chính là tôi có thể.

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

5

tôi muốn mở rộng trên các câu trả lời một chút để nó cũng áp dụng cho gọi một OData Service Operation Action. Câu trả lời được đăng câu trả lời là đúng, nhưng có một thứ tự cụ thể trong đó các tham số cho một hoạt động dịch vụ phải được mã hóa. Hoạt động

Dịch vụ OData nhận tham số kiểu nguyên thủy nơi dây được kèm theo trong một 'như vậy mà một url hợp lệ (pre mã hóa) sẽ là như vậy

AddClosedCurve? Value =' o''clock'

này sẽ gây ra các máy chủ để xem

AddClosedCurve? value = 'o'

'đồng hồ'

sẽ tạo "Yêu cầu không hợp lệ - Lỗi trong cú pháp truy vấn".

Để sửa lỗi này, bạn phải tăng gấp đôi thoát 'và UrlĐổi mã trước khi chèn vào url.

Không UrlKích hoạt chính url.

Đây là một ví dụ sẽ hoạt động.

// 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" 
} 
Các vấn đề liên quan