foreach (string word in allTheseWords)
{
allTheseStringsWhereClause = allTheseStringsWhereClause +
" report=" +
word +
" AND ";
}
问题出在循环之后,SQL子句的末尾有一个额外的AND
。
我该如何解决这个问题?
答案 0 :(得分:13)
您也可以使用LINQ
string _final = string.Join(" AND ", (allTheseWords.Select(x => "report=" + x)));
答案 1 :(得分:4)
通过将用户输入插入到sql where子句中,您将为 SQL注入攻击引入向量。不要使用这种方法。基本上你想使用SQL参数。
where report in @allTheseWords
请参阅http://en.wikipedia.org/wiki/SQL_injection
修改强>
查看Parameterize an SQL IN clause中投票最多的答案,了解如何在查询中进行参数化。
答案 2 :(得分:2)
这类问题很常见,这就是证据。
但这是我的简单解决方案
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();
答案 3 :(得分:1)
一种简单的方法是添加一个伪的always-true子句(并移动AND):
string allTheseStringsWhereClause = "WHERE 1=1";
foreach (string word in allTheseWords)
{
allTheseStringsWhereClause = allTheseStringsWhereClause +
" AND report=" +
word;
}
答案 4 :(得分:0)
您不需要LINQ,只需使用Join
:
string whereClause = " report=" + String.Join(" AND report=", allTheseWords);
答案 5 :(得分:-1)
在不对子字符串方法进行硬编码的情况下执行此操作的最佳方法是尝试聚合LINQ查询
var result = allTheseWords.Aggregate(allTheseStringsWhereClause, (current, word) => current + " report=" + word + " AND ");
答案 6 :(得分:-3)
易。你只需要做allTheseStringsWhereClause.substr(0,-4)就可以了!