Метод выбора 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();
}