とめどもSeasar日誌

2004 | 05 |

2004-05-18

ひがさんのコメントへの返信 15:26

現状だとどの部分でエラーになります?原因を把握したうえで修正したいので。

ということなので下のエントリの詳細をここに書きます。

S2TestCase#readXlsWriteDB()を呼び出すと、PreparedStatementUtil#executeUpdate()でSQLRuntimeExceptionが発生します。そのとき発行されてるSQL文が、"INSERT INTO HOG) VALUE)"(テーブル名がHOGEのとき)となっております。

SQLServerやMySQLで列名が小文字の場合、DataTableImpl#setupMetaData()を呼び出した際にローカル変数columnSetに小文字の列名が入ってしまうため、DataTableImplの197行目、

if (columnSet.contains(column.getColumnName().toUpperCase())) {

が必ずfalseになってしまい、生成されるSQL文がおかしくなってしまうようです。


DatabaseMetaData 14:07

こないだの続きでS2Unitを使ってみました。S2.0.8で前回の問題は解消されたはず……なのですが、カラム名に小文字が含まれる場合失敗してしまいました。SQL Server2000及びMySQL4.0.18で現象を確認。

java.sql.DatabaseMetaData#getColumns()の返り値のリザルトセット内にテーブルの列名が入ってくるのですが、その列名が、RDB(というかJDBCドライバ)によってCASE SENSITIVEな場合とそうでない場合があるんですかね。んで、CASE SENSITIVEなSQL Server2000(MSなのに……)とMySQLは今のままでは動かないようです。

とりあえず対策として、DatabaseMetaDataUtil内の39行目と67行目にある

set.add(rs.getString(4));

を、

set.add(rs.getString(4).toUpperCase());

とすると動きました。

っていうか、こういうバグ報告はMLですべきかな、やっぱり。社内からだと会社のアドレスでしか送れない環境にいるので、とりあえずこっちに書きますけど。

コンポーネント内でのコンテナの取得方法 11:07

ここによれば"s2:container"という名前を利用してS2Containerのインスタンスを取得出来るとのことですが、S2.0.8からは"container"になった模様。どこにも書いてないのでメモ。

でもこれは出来れば使うべきじゃない。コンポーネント内でS2Containerを使ってしまうと、S2Containerは最早依存性注入コンテナではなく、ただのコンテナになってしまうから。あるコンポーネントがどのコンポーネントに依存するか、という情報は全て.diconファイル内で定義しておくべきなのだ。

higayasuohigayasuo2004/05/18 12:53しまった。マニュアル修正しておきます。

higayasuohigayasuo2004/05/18 15:03別に日記でも全然OKです。それはそうと現状だとどの部分でエラーになります?原因を把握したうえで修正したいので。

higayasuohigayasuo2004/05/18 16:22どうもありがとうございます。S2のほうでCaseInsensitiveで処理できるように修正したいと思います。