Seasar - DI Container with AOP -
Seasar DI Container with AOP
S2Dao.NET TOPページへ

S2Dao.NET - SQLコメント

S2Dao.NETでは、メソッドの引数とSQL文のバインド変数の対応付けを/**/や--等のコメントを使って行います。 コメントなので、対応付けをした後でも、SQL Server Management StudioのようなSQLの発行を行えるツールでそのまま実行することが出来ます。 最初、SQLファイルのツールでSQL文を実行して思い通りの結果を出力するようになったら、それに対してコメントを埋め込んでいくと良いでしょう。

また、SQL文に対しての説明の意味でのコメントを使用したい場合は、/*の後にスペースを入れることにより、 普通のコメントを使用することが出来ます。例として、/* hoge*/となります。/*の後にスペースが入っているので、実行時には無視されます。

バインド変数コメント

Daoに定義したメソッドの引数の値をSQL文で使用する場合は、SQL文にバインド変数コメントを記述します。 バインド変数コメントとリテラルが引数の値に自動的に置換され実行されます。バインド変数コメントは以下のように記述します。

/*引数名*/リテラル

引数がDTOでそのプロパティの値を使いたい場合は、以下のように記述します。

/*引数名.プロパティ名*/リテラル

リテラルの部分には、empno=/*empno*/7788のようにダミーデータを記述することができます。 ダミーデータを記述しておくことでSQLを発行するツールでダミーデータを用いて簡単にテストを行うことができます。 /*empno*/の部分はSQLのコメントと認識されるのでSQL発行ツールでは無視される為です。 リテラル(ダミーデータ)は*/の後にスペースを入れずに連続して入力して下さい。

以下はバインド変数コメントのサンプルです。

C#
IEmployee GetEmployee(int empno);
VB.NET
Function GetEmployee(empno As Integer) As IEmployee

Daoに上記のメソッドを定義した場合、SQLファイル(IEmployeeDao_GetEmployee.sql)は次のようにバインド変数を使用することが可能です。 自動的にGetEmployeeメソッドの引数の値が設定されます。

SELECT * FROM emp WHERE empno = /*empno*/7788

IN句

IN句にバインド変数を適用したい場合は以下のようにすることが出来ます。

IN /*引数名*/(..)

IN句の場合は引数名の後ろのリテラル(ダミーデータ)は必須となります。 以下のようにリテラルを記述して下さい。

IN /*names*/('aaa','bbb')

引数はSystem.Collections.IListや配列の引数となります。上記のIN句の場合は、以下のように引数を用意します。

C#
string[] names = new string[]{"SCOTT", "SMITH", "JAMES"};
VB.NET
Dim names() As String = {"SCOTT", "SMITH", "JAMES"}

string配列namesが自動的にバインド変数の部分に置換されます。

LIKE

LIKEを使用する場合は、次のようにします。

ename LIKE /*ename*/'hoge'

ワイルドカードを使いたい場合は、メソッドの引数の値に埋め込みます。「"COT"を含む」という条件を指定する場合は、 以下のように引数の値にワイルドカードを埋め込みます。

C#
employeeDao.FindEmployees("%COT%");
VB.NET
employeeDao.FindEmployees("%COT%")

埋め込み変数コメント

Daoに定義したメソッドの引数の値をSQL文に文字列として直接埋め込む場合は、SQL文に埋め込み変数コメントを記述します。 埋め込み変数コメントとリテラル(ダミーデータ)に引数の値が自動的に置換され実行されます。 埋め込み変数コメントは以下のように引数名の前にドルマーク($)を記述します。

/*$引数名*/リテラル

引数がDTOの場合は以下のように記述します。

/*$引数名.プロパティ名*/リテラル

埋め込み変数コメントは、次のようにテーブル名を動的に変えたい場合に使えます。

SELECT * FROM sales_/*$year*/

IFコメント

IFコメントでは、条件に応じて実行するSQL文を変えることが可能です。 IFコメントは以下の形式で記述します。

/*IF 条件*/.../*END*/

サンプルは以下のとおりです。

/*IF hoge != null*/hoge = /*hoge*/'abc'/*END*/

IFコメントは、条件が真の場合、/*IF*/と/*END*/に囲まれた部分が評価されます。 上記の場合、引数hogeがnullでない場合にのみ、IFコメントで囲まれている部分(hoge = /*hoge*/'abc')が使われます。 また偽の場合の処理としてELSEコメントが用意されています。 条件が偽となった場合は、"ELSE"の後に記述した部分が使われます。ELSEコメントは以下のように記述します。

/*IF hoge != null*/hoge = /*hoge*/'abc'
  -- ELSE hoge is null
/*END*/

条件がfalseになると-- ELSEの後の部分(hoge is null)が使われます。

BEGINコメント

BEGINコメントは、WHERE句内の全てのELSEを含まないIFコメントがfalseになった場合に、 WHERE句自体を出力したくない場合に使います。BEGINコメントはIFコメントと併せて使用します。 BEGINコメントは以下の形式で記述します

/*BEGIN*/WHERE句/*END*/

サンプルは以下の通りです。

/*BEGIN*/WHERE
  /*IF job != null*/job = /*job*/'CLERK'/*END*/
  /*IF deptno.HasValue == true*/AND deptno = /*deptno*/20/*END*/
/*END*/

上記の場合、job, deptnoがnullの場合は、WHERE句は出力されません。job == null, deptno.HasValue == trueの場合は、 WHERE deptno = ?となります。job != null, deptno.HasValue == trueの場合は、 WHERE job =? AND deptno=?のようになります。動的SQLも思いのままです。