[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 メーリングリストの案内