C#中带单引号的DataTable选择方法冲突

8
我最近发现当我在包含撇号的字段下进行LINQ选择时,它会导致我的应用程序抛出异常。
DataRow[] newDr = this.ds.Tables["TableName"].Select("Name = '" + drData["Name"].ToString() + "'");

如果drData ["Name"] =“公司的钱” 我遇到了一个"语法错误:'S'运算符后面缺少操作数"的异常 请问有人能告诉我如何保留它而不替换或删除它吗?

1
这是一个经典案例,展示未对用户输入进行消毒处理的后果。 - lc.
值得一提的是,文档提到了这个页面,详细解释了如何以及需要转义什么内容。 - lc.
1
@lc.: 输入没有问题。 - siride
@siride 从技术上讲,输入没有任何“错误”,它很可能在设计端处于预期的有效输入范围内。但是,在查询中盲目执行它会使这个看似无害的输入产生灾难性的影响。无论如何,您需要注意字符串不包含任何会被误解的字符,这是净化过程的一部分。无论是完全禁止 ' 字符,对其进行编码还是转义,都取决于架构/业务设计。 - lc.
2个回答

23

你需要将单引号转义为两个单引号,还可能有其他特殊字符,所以你需要注意它们:

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

在筛选字符串中转义特殊字符的更多示例(用于 Select 方法): 行过滤器字符串示例


7

这里用到的不是LINQ Select,而是DataTable.Select方法。你遇到的错误是因为有字符',你需要使用两个''进行转义。简单的方式是进行替换:

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

您可以查看此问题,了解如何在DataTable.Select中转义字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接