[Seasar-user:1691] Re: S2DAO ERROR

Masanobu Shimura mikeshimura
2005年 3月 28日 (月) 12:51:38 JST


福澤さま

ありがとう御座いました。試してみます。

志村

--- [E-MAIL ADDRESS DELETED] からのメッセージ:
> 福澤です。
> 
> > ------------------------------
> > 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 mailing list
> [E-MAIL ADDRESS DELETED]
> http://lists.sourceforge.jp/mailman/listinfo/seasar-user



Seasar-user メーリングリストの案内