[seasar-dotnet:314] Re: SQLコメントに : が含まれるとIndexOutOfRangeException

Ryo Miyagi rmiyax @ yahoo.co.jp
2006年 7月 24日 (月) 17:31:11 JST


宮城です。

> 以下のような外だしSQLを記述していたとします。
> 
> -- [SQL]
> -- ShopOrderDetailInfoDao_SelectListAsOrderDetailInfo()
> -- [Argument]
> --   1. pb   : Paging-bean
> --   2. pmb  : Sql-parameter-bean
> --

S2DAOでは、行コメント("--")には対応していません。
Java版でも同じだと思います。(何故だろう?)
この場合、/* */ のコメントを使用することで代用できます。

例:
/*
 * [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 = ?
   ...(略)


上記例の場合、DBに投げられるSQL文は、
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 = ?
   ...(略)
になります。

前ヴァージョンで行コメント("--")を含むSQL文が実行できた理由は、
使用しているDBもしくはデータプロバイダが
行コメントを認識していたからだと思います。


> Logに吐き出すSQL文字列生成のためにBind変数をsqlから
> 正規表現で抽出するところで、上記SQLのコメント部分の「:」を拾う
> ようになりました。
> 正規表現の[+]を[*]に変更したことによってこのようになったようです。

S2ADO側では、SQLコメントの解析処理を実装する予定はありません。
しかし、
"UPDATE emp SET ename = 'a:bcd' WHERE empno = :empno
のように、文字列中にBind変数に該当する文字が埋め込まれると
Bind変数を誤認識します。
このバグは次バージョンで修正する予定です。申し訳ありません。


> 一番良いのは、コメント中のBind変数は無視するとなりますが、
> それは労力要りそうなので(しかもDebugLogだけの話だし・・・)、
> せめてIndexOutOfRangeExceptionになる直前でチェックしてあげて、
> 「引数とBind変数の個数が違います。
>   もしかしてSQLコメントにBind変数記号が入ったりしてませんか?」
> みたいなエラーを出してあげるとうれしいです。

御指摘ありがとうございます。
分かりやすいExceptionを出すように修正したいと思います。

以上


--------------------------------------
Let's start Yahoo! Auction  -  Free Campaign Now!
http://pr.mail.yahoo.co.jp/auction/


seasar-dotnet メーリングリストの案内