質問

.Netのパラメーター化されたクエリは、例では常に次のようになります。

SqlCommand comm = new SqlCommand(@"
   SELECT * 
   FROM   Products 
   WHERE  Category_ID = @categoryid
", 
   conn);
comm.Parameters.Add("@categoryid", SqlDbType.Int);
comm.Parameters["@categoryid"].Value = CategoryID;

しかし、私はレンガ壁にぶつかって次のことをしようとしています:

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は、コンマで区切られた数字のリストです。「123,456,789」; (引用符なし)
  • 名前は文字列であり、単一引用符やその他の不適切な文字が含まれている可能性があります

これに適した構文は何ですか?

役に立ちましたか?

解決

整数の配列にカテゴリIDがあり、Nameが文字列であるとしましょう。秘Theは、コマンドテキストを作成して、すべてのカテゴリIDを個別のパラメーターとして入力し、名前のあいまい一致を作成できるようにすることです。前者を行うには、ループを使用してパラメーター名のシーケンス@ p0〜@ pN-1を作成します。ここで、Nは配列内のカテゴリーIDの数です。次に、パラメーターを作成し、各名前付きパラメーターの値として関連付けられたカテゴリIDでコマンドに追加します。次に、クエリ自体の名前に連結を使用して、名前のあいまい検索を許可します。

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",<*>quot;%{Name}%");
comm.CommandText = "SELECT * FROM Products WHERE Category_ID IN (";
comm.CommandText += string.Join(",", parameters) + ")";
comm.CommandText += " OR name LIKE @name";

これは、DBAを満足させるための完全にパラメータ化されたクエリです。これらは整数であるため、名前をパラメータ化しながら、値を使用してコマンドテキストを直接作成するだけではセキュリティ上のリスクはそれほど大きくないと思われます。カテゴリIDが文字列配列にある場合は、配列をコンマで分割し、それぞれを整数に変換して、整数配列に格納します。

注:この例では配列を使用していますが、どのコレクションでも機能するはずですが、イテレーションはおそらく異なります。

http://www.tek-tips.comからのオリジナルのアイデア/viewthread.cfm?qid=1502614&page=9

他のヒント

&quot;%&quot;が必要ですsqlパラメーターの値。

SqlCommand comm = new SqlCommand("SELECT * FROM Products WHERE Category_ID IN (@categoryid1, @categoryid2) OR name LIKE @name", conn);
comm.Parameters.Add("@categoryid1", SqlDbType.Int);
comm.Parameters["@categoryid1"].Value = CategoryID[0];
comm.Parameters.Add("@categoryid2", SqlDbType.Int);
comm.Parameters["@categoryid2"].Value = CategoryID[1];
comm.Parameters.Add("@name", SqlDbType.Int);
comm.Parameters["@name"].Value = "%" + Name + "%";

このアプローチは機能しません。期間。

IN句にはパラメータのリスト自体が必要なので、 one パラメータをバインドすると、 one 値を渡すことができます。

渡そうとする個々のIN句プレースホルダーの正確な量でステートメント文字列を動的に構築し、ループでパラメーターを追加し、値をバインドします。

これが正しい方法であるかどうかはわかりませんが、前の手順で行った方法です

list templist =新しいリスト

comm.Parameters.Add(&quot; @ categoryids&quot ;, SqlDbType.varchar); comm.Parameters [&quot; @ categoryids&quot;]。value = string.join(&quot;、&quot;、templist.toarray())

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top