1
foreach (string word in allTheseWords)
{
allTheseStringsWhereClause = allTheseStringsWhereClause + 
                             " report=" + 
                             word + 
                             " AND ";
}

AND问题是在循环之后,SQL 子句在它的末尾有一个额外的。

我该如何解决?

4

7 回答 7

13

您也可以使用LINQ

string _final = string.Join(" AND ", (allTheseWords.Select(x => "report=" + x)));
于 2013-01-27T05:59:05.320 回答
4

通过将用户输入插入到 sql where 子句中,您正在为SQL Injection Attack引入一个向量。不要使用这种方法。基本上你想使用 SQL 参数。

where report in @allTheseWords

请参阅http://en.wikipedia.org/wiki/SQL_injection

编辑

请参阅参数化 SQL IN 子句中投票最多的答案,了解如何在查询中真正进行参数化。

于 2013-01-27T06:18:55.967 回答
2

这种问题很常见,这里就是证明。

  1. 删除字符串的最后一个字符
  2. 如何在C#中删除字符串中的最后一个字符?
  3. 查找数组的最后一个索引

但这是我的简单解决方案

        string[] allTheseWords = { "try", "test", "let" };
        string whereLine = string.Empty;
        foreach (var item in allTheseWords)
                whereLine += "report = " + item.ToString() + " and ";
        string final = whereLine.Remove(whereLine.Length - 5);
        Console.WriteLine(final);
        Console.ReadLine();
于 2013-01-27T07:46:21.587 回答
1

一个简单的方法是添加一个虚假的 always-true 子句(并移动 AND):

string allTheseStringsWhereClause = "WHERE 1=1";
foreach (string word in allTheseWords)
{
allTheseStringsWhereClause = allTheseStringsWhereClause + 
                             " AND report=" + 
                             word;
}
于 2013-01-27T06:43:58.857 回答
0

您不需要 LINQ,只需使用Join

string whereClause = " report=" + String.Join(" AND report=", allTheseWords);
于 2013-01-27T09:40:29.400 回答
-1

在不硬编码子字符串方法的情况下执行此操作的最佳方法是尝试聚合 LINQ 查询

var result = allTheseWords.Aggregate(allTheseStringsWhereClause, (current, word) => current + " report=" + word + " AND ");
于 2013-01-27T05:56:17.020 回答
-3

简单的。您只需要执行 allTheseStringsWhereClause.substr(0,-4) 即可!

于 2013-01-27T05:56:50.533 回答