代码之家  ›  专栏  ›  技术社区  ›  Retrocoder

如何转义要在OData查询中使用的单引号?

  •  27
  • Retrocoder  · 技术社区  · 14 年前

    我正在使用OData查询我的数据库。当adapterName只包含文本时,下面的代码行可以正常工作。

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

    如果adapterName包含一个引号,它将失败。我尝试使用以下代码转义单引号:

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

    4 回复  |  直到 14 年前
        1
  •  93
  •   user448516 user448516    14 年前

    实际上%27不是一个解决方案。正确的转义方法是在字符串中放置两个单引号,而不是一个。 例如 "o''clock"

        2
  •  9
  •   Mike Michaelis    10 年前

    oData服务操作接收原始类型参数,其中字符串被封装在一个'

    添加字符串?值='o''clock'

    这将使服务器看到

    添加字符串?值='o'

    将生成“查询语法中的错误请求错误”

    若要更正此问题,必须在插入到url之前对“”和UrlEncode进行双重转义。

    不要对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"
    }
    
        3
  •  1
  •   Ivan Zakharchuk    5 年前

    它实际上在oData文档中有描述: http://docs.oasis-open.org/odata/odata/v4.01/cs01/part2-url-conventions/odata-v4.01-cs01-part2-url-conventions.html#sec_URLComponents

    例如,这些规则之一是字符串文本中的单引号表示为两个连续的单引号。

    示例3:有效的OData URL:

    http://host/service/People ('O''Neil')

    http://host/service/People(%27O%27%27Neil%27)

    http://host/service/People%28%27O%27%27Neil%27%29

    http://host/service/Categories

    示例4:无效的OData URL:

    http://host/service/People网站 (“奥尼尔”)

    http://host/service/People网站 ('O%27Neil')

    (“智能手机/平板电脑”)

    第一个和第二个示例无效,因为字符串文本中的单引号必须表示为两个连续的单引号。第三个示例无效,因为正斜杠被解释为路径段分隔符和类别(“Smartphone不是有效的OData路径段,Tablet也不是”)。

        4
  •  0
  •   DATEx2    11 年前

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

        5
  •  -1
  •   jmbmage    10 年前

    而不是使用$filter=Title eq'text'

    我正在使用oData startswith()函数。

    $filter=startswith(标题,键)

    然后我尽可能多地把钥匙交进去。

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