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

問題はループの後です。SQL 句ANDの最後に余分なものがあります。

これを修正するにはどうすればよいですか?

4

7 に答える 7

13

代わりに使用することができますLINQ

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

ユーザー入力をsqlwhere句に挿入することにより、SQLインジェクション攻撃のベクトルを導入します。このアプローチは使用しないでください。基本的に、SQLパラメータを使用します。

where report in @allTheseWords

http://en.wikipedia.org/wiki/SQL_injectionを参照してください

編集

クエリで実際にパラメータ化を行う方法については、SQLIN句のパラメータ化で最も多くの票を獲得した回答を参照してください。

于 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

簡単な方法は、偽の常に真の節を追加する (そして 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

部分文字列メソッドをハード コーディングせずにこれを行う最善の方法は、Aggregate 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 に答える