IN句とSqlParameter
IN句の扱いについてのお話。
.NETでSQLを扱う際にSqlParameterを使う機会が多い。
SqlParameterを使う場合は、SqlCommandにSQLを設定して対応するパラメータに一つずつ割り当てることになるが、IN句みたいに複数の値を扱う場合は使い辛かったりする。
そこで、次のようなクラスを使って解決することにした。
public class InnerParameter<ValueType, ParameterType> where ParameterType : DbParameter { private string prefix = "@P"; public string Prefix { get { return this.prefix; } set { this.prefix = value; } } public string GetInnerSql(int paramNum) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < paramNum; i++) { sb.Append((i == 0) ? string.Empty : ","); sb.Append(prefix + i.ToString()); } return sb.ToString(); } public void SetInnerParam(DbCommand command, ValueType[] values) { for (int i = 0; i < values.Length; i++) { DbParameter parameter = new ParameterType(); parameter.ParameterName = prefix + i.ToString(); parameter.Value = values[i]; command.Parameters.Add(parameter); } } }
使い方は次の通り。
string[] values = new string[] { "01", "02", "03", "04", "05" }; InnerParameter<string, SqlParameter> innerParam = new InnerParameter<string, SqlParameter>(); string innerSql = innerParam.getInnerSql(values.Length); string sql = string.Format("SELECT * FROM HogeTable WHERE ID in {0}", innerSql); DbCommand command = new SqlCommand(sql); innerParam.setInnerParam(command, values);
具体的に言うと、
- InnerParameterのインスタンス生成(値の型とDbParameterの型を指定)
- getInnerSqlメソッドでIN句用のSQL生成
- SQLに埋め込み
- setInnerParamメソッドでパラメータ設定
という感じ。
InnerParameterクラス自体はもっと作りこみが必要だとは思うけどこれで最低限の目的は達成できるかな。