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