開発環境とやりたいこと
---開発環境
言語:C#
RDMS:オラクルDB
---やりたいこと
バインド変数を用いてLIKE検索
実装できなかったコード
//~~省略~~
conn = DbConnect();
string sql = string.Empty;
sql += "SELECT * from テーブル名";
sql += "where カラム名 like '%:parameter%'";
using (cmd = CreateSelectCommand(sql, conn))
{
cmd.BindByName = true;
cmd.Parameters.Add("parameter", フロントから受け取るパラメーター名);
using (da = new OracleDataAdapter(cmd))
{
da.Fill(ds, 接続するテーブル名);
}
}
//~~省略~~
なぜ実装でいなかったのか??
sql += "where カラム名 like '%:parameter%'";
原因はここの行です。
正確には'%:parameter%'
ここですね。
かりに今回バインドされた変数がhogehoge
だったとしたらこのようにしょりされてしまいます。
sql += "where カラム名 like '%''hogehoge''%'";
これでは当然うまくいきません。
僕の頭の中ではsql += "where カラム名 like '%hogehoge%'";
このように行くと思っていたんですけどね、、
なぜこのよなうな処理になるのか??
仮にバインドされる変数がhogehoge
ではなく--hogehoge
だった場合を考えてみましょう。
ここではっと来た人がいるかも知れません。
そうです。もしバインド変数に--
が入っていた場合に文字列として扱わないとコメントアウトされてSQLが動かなくなってしまいますね!!
最終的に実装したコード
//~~省略~~
conn = DbConnect();
string sql = string.Empty;
sql += "SELECT * from テーブル名";
sql += "where カラム名 like :parameter%";
using (cmd = CreateSelectCommand(sql, conn))
{
cmd.BindByName = true;
cmd.Parameters.Add("parameter", "%" + フロントから受け取るパラメーター名) + "%";
using (da = new OracleDataAdapter(cmd))
{
da.Fill(ds, 接続するテーブル名);
}
}
//~~省略~~
バインドした後に加工されてしまうのでバインドされる前に出力したいようにセットしてあげようということでこのように実装することで期待する動作が確認できました!!