1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

オラクルDB LIKE句 でバインンド変数を使う

Last updated at Posted at 2021-05-27

開発環境とやりたいこと

---開発環境
言語: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, 接続するテーブル名);
    }
}
//~~省略~~

バインドした後に加工されてしまうのでバインドされる前に出力したいようにセットしてあげようということでこのように実装することで期待する動作が確認できました!!

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?