LIKE 条件と IN 条件を使用したパラメータ化されたクエリ
パラメータ化されたクエリにおける一般的な障害の 1 つは、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;
ここでの目標は、クエリを構築することです。カテゴリ ID (CategoryID) と特殊文字を含む可能性のある文字列 (Name) のカンマ区切りリストに基づいて製品を取得します。ただし、次の理由により、上記のコードは正しく機能しません。
正しい構文には、複数のステップからなるアプローチが必要です。
次のコードは、改訂されたアプローチを示しています。
string Name = "someone"; int[] categoryIDs = new int[] { 238, 1138, 1615, 1616, 1617, 1618, 1619, 1620, 1951, 1952, 1953, 1954, 1955, 1972, 2022 }; 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";
このコードは、IN 条件と LIKE 条件の両方の要件を満たす完全にパラメーター化されたクエリを生成します。
以上がLIKE 句と IN 句を使用して SQL クエリを適切にパラメータ化する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。