LIKE 条件と IN 条件を使用したパラメーター化されたクエリ
.NET プログラミングの世界では、パラメーター化されたクエリは通常、簡単に設定できます。ただし、複数の値が関係する複雑な条件を扱う場合には問題が発生します。
IN 条件と LIKE 条件の両方を含む次のクエリを考えてみましょう。
SqlCommand comm = new SqlCommand(@" SELECT * FROM Products WHERE Category_ID IN (@categoryids) OR name LIKE '%@name%' ", conn); comm.Parameters.Add("@categoryids", SqlDbType.Int); comm.Parameters["@categoryids"].Value = CategoryIDs; comm.Parameters.Add("@name", SqlDbType.Int); comm.Parameters["@name"].Value = Name;
この場合、CategoryIDs はカンマで区切られた数値のリスト。名前は特殊文字を含む文字列です。課題は、これらの値を正しくパラメータ化することにあります。
解決策
この問題に取り組むために、パラメータ名 @p0 から @pN-1 のシーケンスを構築します。ここで N配列内のカテゴリ ID の数です。次に、各名前のパラメータを作成し、対応するカテゴリ ID を値として割り当てます。
LIKE 条件の場合、文字列連結を使用して、@name を含むあいまい検索式を構築します。
これはプロセスを説明する例:
string Name = "someone"; int[] categoryIDs = new int[] { ... }; SqlCommand comm = conn.CreateCommand(); string[] parameters = new string[categoryIDs.Length]; for(int i=0;i<categoryIDs.Length;i++) { parameters[i] = "@p"+i; comm.Parameters.AddWithValue(parameters[i], categoryIDs[i]); } comm.Parameters.AddWithValue("@name",$"%{Name}%"); comm.CommandText = "SELECT * FROM Products WHERE Category_ID IN ("; comm.CommandText += string.Join(",", parameters) + ")"; comm.CommandText += " OR name LIKE @name";
この完全にパラメーター化されたクエリにより、複雑な条件を処理する際のセキュリティと柔軟性が確保されます。この例では配列を使用していますが、この手法は値の任意のコレクションに適用できます。
以上が.NET SQL クエリで LIKE 条件と IN 条件をパラメータ化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。