具有单引号冲突的DataTable select方法C#

时间:2013-09-06 17:45:36

标签: c# linq select datarow apostrophe

我最近发现当我在包含撇号的字段下进行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 "

有人可以告诉我如何保存它,不要更换或删除它吗?

3 个答案:

答案 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();
}