- PR -

ADO.NETでのIN演算子について

投稿者投稿内容
Marble Patio
会議室デビュー日: 2004/04/20
投稿数: 3
投稿日時: 2005-03-29 14:18
つまり、A.XXX IN ("AAA","BBB",...) 要素数可変
というSQLのIN要素の値をパラメータを使用して設定するにはどうすればよいか。という事ですよね。

私も同じ様な事で悩んでいます。私の場合は、
「DateTime型のパラメータに値としてSYSDATEを設定する」
ですが。
ロバさんの挙げている「SQLインジェクション対策をしたくない」でパラメタをなるべく利用したいですが、この辺りの事で全てをパラメタで行えないのが現状です
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2005-03-29 14:40
動作確認してないですが、こんな感じです。

コード:
// conditionsにINの条件が格納されていると仮定する
// 型はString(独自Classでも問題ない)
ArrayList conditions = new ArrayList();

// SELECT文を動的に生成する
System.Text.StringBuilder sql = new System.Text.StringBuilder();
sql.Append("SELECT * FROM A WHERE A.XXX IN (");
for (int i = 0 ; i < conditions.Count ; i++)
{
	if (i > 0)
	{
		sql.Append(",");
	}
	sql.Append("@Param" + i.ToString());
}
sql.Append(")");

SqlCommand command = new SqlCommand(sql.ToString());

// SQLパラメータを動的に生成する
for (int i = 0 ; i < conditions.Count ; i++)
{
	SqlParameter param = new SqlParameter("@Param" + i.ToString(), SqlDbType.VarChar);
	param.Value = conditions[i];
	command.Parameters.Add(param);
}



SYSDATEの場合はユーザーの入力ではないので、直にSQLに書いて問題ないのではないでしょうか?
いのつち
ベテラン
会議室デビュー日: 2002/05/14
投稿数: 73
投稿日時: 2005-03-29 18:54
こんなストアドを書いて、それを呼び出すとか・・・ってのはどうでしょう。
ADO.NETのパラメータ経由では試していませんが。

create proc pr_InSQL
@param nvarchar(2000)
as

/* パラメータの例
set @param = '''IA-22'' ,''IA-28'' '
*/

declare @sSql nvarchar(4000)
set @sSql= 'select * from ProductList where productID in (' +@param + ')'
exec (@sSql)

@param の値の整合性は、いずれにしてもチェックが必要そうですね。
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2005-03-29 19:14
引用:
こんなストアドを書いて、それを呼び出すとか・・・ってのはどうでしょう。


それってアプリケーションからアドホッククエリを投げるのと同じじゃないですか?
SQLインジェクションを十分に防げるかどうか怪しそうなんですが・・・。

もしかして exec() はシングルステートメントのみ実行可能、コメント等の冗長な記述があるとエラーになるなどの SQLインジェクションを予防できるような制限があるのでしょうか?
ロバ
会議室デビュー日: 2005/03/28
投稿数: 7
投稿日時: 2005-03-30 02:29
返事が遅くなってすみません。
一日中仕事に追われてまして・・・

おそらくburton999さんのおっしゃるとおり、
SQL文字列を生成した上でパラメータにセットするのが最適のようですね。
SQL文字列は静的なものでパラメータだけが可変、という印象があったので
考え付きませんでした。
今後はその方向で実装しようと思います。

スキルアップ/キャリアアップ(JOB@IT)