C# 如何转义要在OData查询中使用的单个引号?
我正在使用OData查询我的数据库。当“adapterName”仅包含文本时,以下代码行可以正常工作C# 如何转义要在OData查询中使用的单个引号?,c#,odata,C#,Odata,我正在使用OData查询我的数据库。当“adapterName”仅包含文本时,以下代码行可以正常工作 ds.query('/DataAdapters?$filter=Name eq \'' + adapterName + '\'', ifmgr_CreateAdapter_Step1, onGenericFailure, ''); 如果“adapterName”包含单个引号,则会失败。我尝试使用以下代码转义单引号: adapterName = adapterName.replace(/\'/g
ds.query('/DataAdapters?$filter=Name eq \'' + adapterName + '\'', ifmgr_CreateAdapter_Step1, onGenericFailure, '');
如果“adapterName”包含单个引号,则会失败。我尝试使用以下代码转义单引号:
adapterName = adapterName.replace(/\'/g, '\\\'');
虽然这可以正确地转义用户定义的文本,但函数仍然失败。有人能告诉我查询中文本的正确格式吗?实际上%27不是一个解决方案。正确的转义方法是在字符串中插入两个单引号,而不是一个单引号。
在示例
“o”clock
中,当使用wit子字符串时,需要使用4而不是1撇号来转义:
a'b->
$filter=(子字符串('a''b',FirstName))
而不是使用$filter=Title eq'text'
我正在使用odatastartswith()函数
$filter=startswith(标题、键)
然后我尽可能多地传递钥匙
var pos=key.indexOf(“')代码>
if(pos>-1){
key=key.substring(0,pos);
我想对答案进行一点扩展,以便它也适用于调用oData服务操作操作。发布的答案是正确的,但服务操作的参数必须按照特定的顺序进行编码
oData服务操作接收原语类型参数,其中字符串包含在一个“字符串”中,因此有效的url(预编码)将是这样的
AddString?value='o''clock'
这将导致服务器看到
AddString?value='o'
及
“时钟”
将产生“错误请求-查询语法错误”
要更正此问题,必须在插入url之前对“”进行双转义并对其进行url编码
不要对url本身进行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"
}
oData文档中实际描述了这一点:
例如,这些规则之一是字符串文本中的单引号表示为两个连续的单引号
示例3:有效的ODataURL:
(“奥尼尔”)
(“智能手机%2f平板电脑”)
示例4:无效的OData URL:
(‘奥尼尔’)
('O%27Neil')
(“智能手机/平板电脑”)
第一个和第二个示例无效,因为string>literal中的一个单引号必须表示为两个连续的单引号。第三个示例无效,因为正斜杠被解释为路径段分隔符和类别(“Smartphone不是有效的OData路径段,Tablet也不是”)
修正:)我需要将单引号转换为双引号。注意:如果使用子字符串筛选器,并且查询已经包含在引号中,则需要使用4'而不是2.+1进行转义。将“替换为”或%27似乎不适用于odata查询。这应该是可以接受的答案。我完全同意,%27给出了400个错误的请求,因为请求路径中的字符无效。只是好奇:用反斜杠转义也可以接受吗?示例:“o'clock”我很困惑,为什么这似乎在我不知道的相关地方没有记录。为了寻找解决办法,我发疯了好几次。这是对答案的评论,而不是对答案的评论