.NETで作る!

.NETに関するあれこれ(C#、VB.NET)

動的SQL文(2Way-SQL)パーサーを作る!

信州FMブログから引っ越し検討のため、サンプルとして過去記事移植。

ソースコードDynamicSQL 2way-SQL parser@CodePlexで公開中。っていうか、そっちのDocumentの方が説明詳しかったりする。

VBSQL書くと保守しづらいよね

高度な検索条件機能を持たせようとすると、「こっちは条件が入力されてないから、条件式に入れないようにして…こっちは指定してあるからAND文で繋いで…」とかやる必要があり、

If … Then
    sql &= …
End If

などというコードであっというまに画面が埋まります。全体像が把握しづらいったらありゃしない。

2Way-SQLがあるじゃないか

2Way-SQLはAND、OR条件が可変になるSQL文を書くのに適した記法なのですが、.NETにパーサー(2Way-SQLを解析するプログラム)が単独で存在するのかしないのかよくわかりません。*1

というわけでIDbCommandを吐くところまでしか行わない(O/Rマッピングなどはしない)、 手軽にどのプロジェクトにでもぶち込めるパーサーを作ってみました。

等式、不等式

書式は

/*ds パラメータ名*/ダミー値 …

ダミー値はパーサーにて除外されますので、デバッグ用の値を入れておいてください。

注意点としては

  • ダミー値は「*/」の後に続けて書いてくださいスペースを入れてはダメ。
  • ダミー値にスペースは入れられません。ダミー値だから別にいいよね?

ちなみにdsは「dynamic sql」の意で、DynamicSQL用のコメントはすべて/*ds …*/の書式になります。

IN句

書式には変更ないですが、パラメータ辞書(変数名:dic)に配列を入れればOK。

IF文

IF文と呼んでますが、

/*ds if パラメータ名 != null*/
    式
/*ds end if*/

の固定書式で、パラメータ値が存在しない、または値が空の場合、条件式自体が消えます。 IF文の入れ子には対応してません。*2

AND、ORなどの演算子は接頭書式でも、接尾書式でも構いませんが、どちらかに統一してください。

IF文によりWHERE句が空になってしまう可能性がある場合は、

/*ds where*/
WHERE
    式
/*ds end where*/

としてください。 WHERE句が空になった場合、WHERE句自体を記述しないようになります。

*1:Seasar2や、DBFluteの機能の一部に存在するのは知っていますが、パーサーだけ提供されているか不明。

*2:多分大丈夫でしょうが未検証。

. .