※信州FMブログから引っ越し検討のため、サンプルとして過去記事移植。
ソースコードはDynamicSQL 2way-SQL parser@CodePlexで公開中。っていうか、そっちのDocumentの方が説明詳しかったりする。
VBでSQL書くと保守しづらいよね
高度な検索条件機能を持たせようとすると、「こっちは条件が入力されてないから、条件式に入れないようにして…こっちは指定してあるから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句自体を記述しないようになります。