Метод выбора DataTable с конфликтом в одинарных кавычках C#

Я недавно обнаружил, что когда я делаю выбор LINQ под полем, содержащим апостроф, мое приложение вызывает исключение.

DataRow[] newDr = this.ds.Tables["TableName"].Select("Name = '" + drData["Name"].ToString() + "'");

Если drData["Name"] = "Деньги бизнеса"

I got an exception of "Syntax error: Missing operand after 'S' operator "

Может кто-нибудь сказать мне, как сохранить его и не заменить или удалить его, пожалуйста?

3 ответа

Решение

Вы должны экранировать одинарные кавычки в 2 одинарные кавычки, могут быть другие специальные символы, поэтому вам нужно позаботиться о них:

DataRow[] newDr = this.ds.Tables["TableName"]
                         .Select(string.Format("Name ='{0}'",drData["Name"].ToString().Replace("'","''")));

Дополнительные примеры экранирования специальных символов в строке фильтра (используется в Select method): примеры строк фильтра строк

Это не LINQ Select, а метод DataTable.Select. Ошибка, которую вы получаете из-за характера 'нужно убежать с двойным '', Простой способ будет заменить его следующим образом:

DataRow[] newDr = this.ds.Tables["TableName"]
                     .Select("Name = '" + drData["Name"].ToString().Replace("'", "''" + "'");

Вы можете увидеть этот вопрос о том, как экранировать символы в DataTable.Select

Вы можете попробовать следующий код:

string Name = EscapeSpecialCharacters(drData["Name"].ToString());

DataRow[] newDr = this.ds.Tables["TableName"].Select("Name = '" + Name  + "'");
private static string EscapeSpecialCharacters(string Name)
{
   StringBuilder sb = new StringBuilder(Name.Length);
   for (int i = 0; i < Name.Length; i++)
   {
        char c = Name[i];
        switch (c)
        {
                case ']':
                case '[':
                case '%':
                case '*':
                    sb.Append("[" + c + "]");
                    break;
                case '\'':
                    sb.Append("''");
                    break;
                default:
                    sb.Append(c);
                    break;
        }
   }
   return sb.ToString();
}
Другие вопросы по тегам