Подтвердить что ты не робот

Правильный способ удаления символов в выражении фильтра DataTable

Я хотел бы знать, есть ли функция для корректного удаления строковых литералов для выражений фильтра. например:.

DataTable.Select(String.Format("[name] = '{0}'", MyName))

Если MyName содержит 'или несколько других ключевых символов, генерируется исключение. Документация Microsoft указывает, что эти символы должны быть правильно экранированы, однако есть немного путаницы в том, как это сделать.

Я попытался заменить 'with \', а также ['], как указано в документации, однако запрос все еще не работает.

Большое спасибо

4b9b3361

Ответ 1

Сбросьте одиночную кавычку, удвоив ее до '. Escape *% [], обернув в []. например

private string EscapeLikeValue(string value)
{
    StringBuilder sb = new StringBuilder(value.Length);
    for (int i = 0; i < value.Length; i++)
    {
        char c = value[i];
        switch (c)
        {
            case ']':
            case '[':
            case '%':
            case '*':
                sb.Append("[").Append(c).Append("]");
                break;
            case '\'':
                sb.Append("''");
                break;
            default:
                sb.Append(c);
                break;
        }
    }
    return sb.ToString();
}

public DataRow[] SearchTheDataTable(string searchText)
{ 
     return myDataTable.Select("someColumn LIKE '" 
                                 + EscapeLikeValue(searchText) + "'");
} 

Благодаря примеры здесь

Ответ 2

Если я заменил "на два одиночных", запрос будет выполнен.

Ответ 3

   /// <summary>
    /// <para>If a pattern in a LIKE clause contains any of these special characters * % [ ], those characters must be escaped in brackets [ ] like this [*], [%], [[] or []].</para>
    /// <para>If the pattern is not in a like clause then you can pass valueIsForLIKEcomparison = false to not escape brackets.</para>
    /// <para>Examples:</para>
    /// <para>- strFilter = "[Something] LIKE '%" + DataTableHelper.EscapeLikeValue(filterValue) + "%'";</para>
    /// <para></para>
    /// <para>http://www.csharp-examples.net/dataview-rowfilter/</para>
    /// </summary>
    /// <param name="filterValue">LIKE filterValue. This should not be the entire filter string... just the part that is being compared.</param>
    /// <param name="valueIsForLIKEcomparison">Whether or not the filterValue is being used in a LIKE comparison.</param>
    /// <returns></returns>
    public static string EscapeFilterValue(string filterValue, bool valueIsForLIKEcomparison = true)
    {
        string lb = "~~LeftBracket~~";
        string rb = "~~RightBracket~~";
        filterValue = filterValue.Replace("[", lb).Replace("]", rb).Replace("​*", "[*​]").Replace("%", "[%]").Replace("'", "''");
        if (valueIsForLIKEcomparison)
        {
            filterValue = filterValue.Replace(lb, "[").Replace(rb, "]");
        }
        else
        {
            filterValue = filterValue.Replace(lb, "[[]").Replace(rb, "[]]");
        }

        return filterValue;
    }