[Seasar-user:1690] Re: S2DAO ERROR
s-fukuzawa@hitachijoho.com
s-fukuzawa
2005年 3月 28日 (月) 12:11:12 JST
福澤です。
> ------------------------------
> select TOP
> /*IF dto.max != null*/ /*dto.max*/ /*END*/
> * from tmp_shi_InterChg
> where
> /*IF dto.searchPn != null*/FindPartNo LIKE /*dto.searchPn*//*END*/
> /*IF dto.level == 0*/and AuthStatus > ' ' /* *//*END*/ order by
> FindPartNo, FindMfr
>
> --------------------
>
> この2行目を 数字の20でしたら問題ないのですが、
>
> /*IF dto.max != null*/ /*dto.max*/ /*END*/
> にすると下記 ERRORが発生してしまいます。
TOP句に対して、プレースホルダを利用して値を動的にバインドできない、というのが原因だと思います。
上の例だと、dto.max != nullならばSQLステートメントは、
select TOP ? * from tmp_shi_InterChg ...
と一旦構築されて、?の部分をバインドしようとしますが、出来ないと。
select文中ではwhere句内でないとプレースホルダは使えない……んですかね?
詳しいことはよく知りませんが。
バッドノウハウ的ですが、dto.maxの取りうる値が限られているのであれば、
以下のように書けば、一応動的にTOPの値を変えられます。
select TOP
/*IF dto.max == 20*/ 20 /*END*/
/*IF dto.max == 30*/ 30 /*END*/
...
* from tmp_shi_InterChg
こうすれば、SQLステートメントは、dto.max == 20 のとき
select TOP 20 * from tmp_shi_InterChg ...
と構築されるはずなので、問題は発生しないです(多分)。
この技、TOP句では使ったことないですが、order by 句を動的に変えたいとき利用してます。
-----------------------
福澤 進
[E-MAIL ADDRESS DELETED]
Seasar-user メーリングリストの案内