[Seasar-user:11989] Re: 【S2Dao】エラー時のExceptionの種類について

Koichi Kobayashi [E-MAIL ADDRESS DELETED]
2007年 12月 7日 (金) 21:00:42 JST


小林 (koichik) です.

Date:    Fri, 7 Dec 2007 17:52:40 +0900
From:    的場 大輔 <[E-MAIL ADDRESS DELETED]>
To:       <[E-MAIL ADDRESS DELETED]>
Subject: [Seasar-user:11978] 【S2Dao】エラー時のExceptionの種類について

> メソッド AAA
> ----------------------------------------
> 1.AテーブルのUpdate
>   ただし、WHERE句の条件に合致するレコードが無い場合があります。
>   (実行結果は0行になることがあるということです。)

バージョンによる排他制御を使っていなければ,
update メソッドの戻り値型を int にすることで,
更新行数を戻り値で判断できます.
更新行数が 0 行なら戻り値が 0 になるだけで,
例外にはならないはずです.

> 2.BテーブルへのInsert
>   ただし、主キーが重複し例外が発生することがあります。

この場合,多くの RDBMS ではSQLException の
SQLState の先頭 2 文字が "23", "27", "44" の
いずれかになります.
# もっとあるかもしれませんが.

正確には,上記の SQLState は主キーに限らない
制約違反ですが,大抵はこれで判断していいのでは
ないかと.
# S2JDBC はこれで判断してます.

> このとき、どちらの処理でエラーが発生してもSQLRutimeExceptionが発生するため、
> 簡単にエラーを判別できないのですが、見分ける方法はあるのでしょうか?

SQLRuntimeException#getCause() で SQLException を
取得することが出来るので,その getSQLState() で
B かどうかを判断できます.

> 過去の情報から、排他制御で更新対象がない場合は
> NotSingleRowUpdateRuntimeExceptionが発生することはわかったのですが、
> この場合は違うようで、情報を探していました。

これはバージョンによる排他制御を使った場合に
スローされる例外です.
バージョンによる排他制御を使っていなければ,
前述のように更新行数が 0 でも例外はスローされない
はずです.


--
<signature>
   <name>Koichi Kobayashi</name>
   <e-mail>[E-MAIL ADDRESS DELETED]</e-mail>
</signature>



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