[seasar-dotnet:313] Re: S2Container.NET 1.2.2 リリース
kubo
jazzflute @ mbn.nifty.com
2006年 7月 24日 (月) 14:33:56 JST
久保です。
> S2Container.NET 1.2.2 をリリースしました
> http://s2container.net.seasar.org/
ヴァージョンアップした際に発生した(判明した)現象を報告します。
以下のような外だしSQLを記述していたとします。
-- [SQL]
-- ShopOrderDetailInfoDao_SelectListAsOrderDetailInfo()
-- [Argument]
-- 1. pb : Paging-bean
-- 2. pmb : Sql-parameter-bean
--
select
shop_OrderDetail.order_detail_id as OrderDetailId
, shop_OrderDetail.order_id as OrderId
, shop_OrderDetail.mpfuid as Mpfuid
, shop_OrderDetail.sale_price as SalePrice
from shop_OrderDetail
where shop_OrderDetail.order_detail_id = ?
...(略)
今回のヴァージョンアップ前では正常に動作しましたが、
ヴァージョンアップ後でExceptionが発生しました。
BasicCommandFactory.ReplaceSql()
System.IndexOutOfRangeException: インデックスが配列の境界外です。
調べた所:
Logに吐き出すSQL文字列生成のためにBind変数をsqlから
正規表現で抽出するところで、上記SQLのコメント部分の「:」を拾う
ようになりました。
正規表現の[+]を[*]に変更したことによってこのようになったようです。
なので、“たまたま”コメント中「:」がヴァージョンアップによって、
引っ掛かるようになったのですが、恐らく前ヴァージョンでもコメント中「?」
で同じ様な現象が起きたのかなって思います。
対応:
SQLのコメント上とは言え、Bind変数記号を(うかつに)利用してしまった
のでこれは自プロジェクトにて直そうかと思います。
そうすれば、何も問題なくヴァージョンアップできるかと思います。
一方で、S2Daoの仕様として、コメントに「:」や「@」や「?」を入れると
IndexOutOfRangeExceptionというのはちょっとつらいかもしれません。
たとえDocumentにその旨を書いたとしても、
S2Daoに慣れている人じゃなければ、さっぱり原因がわからない状態に
なってしまうかと思います。
(しかも、log4netのレベルをINFOにすると発生しないので余計に混乱...)
一番良いのは、コメント中のBind変数は無視するとなりますが、
それは労力要りそうなので(しかもDebugLogだけの話だし・・・)、
せめてIndexOutOfRangeExceptionになる直前でチェックしてあげて、
「引数とBind変数の個数が違います。
もしかしてSQLコメントにBind変数記号が入ったりしてませんか?」
みたいなエラーを出してあげるとうれしいです。
自プロジェクトでは、外だしSQLにしっかりコメントを記述するように
展開しています。気をつけてと通知しても大人数だと、
誤って「:」や「@」や「?」を入れて、「うーん」と悩む人も
出てきてしまう可能性もあって懸念しています。
(優先度は超低で構いません。将来的にそうなって欲しいというレベルです)
--
kubo <jazzflute @ mbn.nifty.com>
seasar-dotnet メーリングリストの案内