Правильный способ экранирования символов в выражении фильтра DataTable - PullRequest
22 голосов
/ 22 декабря 2008

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

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

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

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

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

Ответы [ 3 ]

32 голосов
/ 28 мая 2010

Избегайте одинарных кавычек, удваивая их до ''. 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) + "'");
} 

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

6 голосов
/ 22 декабря 2008

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

0 голосов
/ 18 июля 2016
   /// <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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...