[Seasar-user:2771] Re: SQLServer で列名に英大文字を含むテーブルのSQL自動生成で例外が発生します
Yasuo Higa
higa
2005年 11月 4日 (金) 10:08:45 JST
<059c01c5daed$c2601bf0$[E-MAIL ADDRESS DELETED]> の、
"[Seasar-user:2750] SQLServerで列名に英大文字を含むテーブルのSQL自動生成で例外が発生します" において、
"西邨 啓一 <[E-MAIL ADDRESS DELETED]>"さんは書きました:
ひがです。
> 初めまして。西村と申します。
>
> S2Dao 1.0.28 を使用しております。
> MS SQL Server 2000で、ソート順がバイナリに設定されたデータベース内の
> 表に、S2DaoのSQL文自動生成機能を使ってアクセスすると下記のような
> 例外が発生してしまいます。
> (JDBCドライバは、マイクロソフト製を使用しております)
>
> [ESSR0071]SQLで例外が発生しました。理由はcom.microsoft.sqlserver.jdbc.SQLServerException:
> 列名 '顧客cd' は無効です。
>
> どうも、列名に含まれる半角アルファベット大文字が、SQL文自動生成時に
> 小文字に変換されてしまっているのが原因のようなのですが、解決策は有る
> でしょうか。
>
マイクロソフト製のJDBC Driverが正しくDatabaseMetaDataを実装していない
のが原因だと思いますが、動かないならそうとばかりも言っていられません。
org.seasar.framework.util.DatabaseMetaDataUtil#convertIdentifier()を
次のように書き換えるとどうなるでしょうか。
これでうまくいくならリリースに組み込みたいと思います。
public static String convertIdentifier(DatabaseMetaData dbMetaData,
String identifier) {
if (identifier == null) {
return null;
}
//System.out.println(dbMetaData.getClass().getName());
if (dbMetaData.getClass().getName().startsWith("com.microsoft.sqlserver")) {
return identifier;
}
if (!supportsMixedCaseIdentifiers(dbMetaData)) {
if (storesUpperCaseIdentifiers(dbMetaData)) {
return identifier.toUpperCase();
}
return identifier.toLowerCase();
}
return identifier;
}
よろしくお願いします。
Yasuo Higa
The Seasar Foundation(http://www.seasar.org/en)
Seasar-user メーリングリストの案内