我最近发现当我在包含撇号的字段下进行LINQ选择时,它会使我的应用程序抛出异常。
DataRow[] newDr = this.ds.Tables["TableName"].Select("Name = '" + drData["Name"].ToString() + "'");
如果drData [“姓名”] =“商家的钱”
I got an exception of "Syntax error: Missing operand after 'S' operator "
有人可以告诉我如何保存它,不要更换或删除它吗?
答案 0 :(得分:13)
您必须将单引号转义为2个单引号,可能还有其他特殊字符,因此您必须处理它们:
DataRow[] newDr = this.ds.Tables["TableName"]
.Select(string.Format("Name ='{0}'",drData["Name"].ToString().Replace("'","''")));
有关在过滤器字符串中转义特殊字符的更多示例(在Select
方法中使用):
Row filter string examples
答案 1 :(得分:5)
它不是LINQ Select,而是它的DataTable.Select方法。您收到的错误是因为字符'
,您需要使用双'
'
来转义它。简单的方法是替换它:
DataRow[] newDr = this.ds.Tables["TableName"]
.Select("Name = '" + drData["Name"].ToString().Replace("'", "''" + "'");
您可能会看到this question有关如何在DataTable.Select中转义字符
答案 2 :(得分:1)
您可以尝试以下代码:
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();
}