アプリ版:「スタンプのみでお礼する」機能のリリースについて

日本語のテーブル名・カラム名を使用したAccess(2000) mdb に
JSPおよびServletからJDBC(ODBC経由)でアクセスすると、
SQL実行[executeQuery()]時に下記のエラーが発生します。

getMessage(): [Microsoft][ODBC Microsoft Access Driver]
getErrorCode(): -1305
getSQLState(): S0002

ただし、
1.Javaアプリケーションから直接JDBC(ODBC経由)でアクセスすると正常に動作します(ResultSet取得)。
2.JSP・サーブレットからのアクセスでも、
  2-1.テーブル名・カラム名がascii文字のテーブルの場合
  2-2.テーブル名・カラム名が日本語でも、SQLで使わない場合
     例:SELECT now()
  の場合は、 正常に動作します(ResultSet取得)。

JSP Servletは
  contentType="text/html; charset=Windows-31J"
  pageEncoding="windows-31j"
で、保存形式は 日本語Shift_JISです。
出力画面表示に文字化けはありません。

作業環境はノートPC1台で、
 Tomcat: 5.5.27
JDK/JRE : 1.6.0_07
 Eclipse: 3.4.2
 OS:Vista Ultimate SP1
 ODBCデータソース:システムDNS Microsoft Access Driver(*.mdb) 6.00.6001.18000 ODBCJT32.DLL
です。

諸兄のお知恵を拝借お願いします。
※エラーコードの内容は?
※どのあたりを調べればよいか?

=========================
Servletの場合のStackTraceなど
--
getMessage:[Microsoft][ODBC Microsoft Access Driver]
getErrorCode:-1305
getSQLState:S0002

java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver]
at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6958)
at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7115)
at sun.jdbc.odbc.JdbcOdbc.SQLExecDirect(JdbcOdbc.java:3111)
at sun.jdbc.odbc.JdbcOdbcStatement.execute(JdbcOdbcStatement.java:338)
at sun.jdbc.odbc.JdbcOdbcStatement.executeQuery(JdbcOdbcStatement.java:253)

=========================
JSPの場合のStackTraceなど
--
getMessage:[Microsoft][ODBC Microsoft Access Driver]
getErrorCode:-1305
getSQLState:S0002

java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver]
at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6958)
at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7115)
at sun.jdbc.odbc.JdbcOdbc.SQLExecDirect(JdbcOdbc.java:3111)
at sun.jdbc.odbc.JdbcOdbcStatement.execute(JdbcOdbcStatement.java:338)
at sun.jdbc.odbc.JdbcOdbcStatement.executeQuery(JdbcOdbcStatement.java:253)
at org.apache.jsp.TestODBC_jsp._jspService(TestODBC_jsp.java:95)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:98)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:331)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:329)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)

A 回答 (2件)

JDBCドライバで使用可能なattributeの一覧は、


以下のような方法で、取得できる様子ですが、得られるattributeの一覧は、
正式に仕様化されているものではなく、暫定的な物らしいので、
将来予告無く変更されるかもしれません。
  /**
   * Get Driver properties
   * @param database URL
   * @return list of driver properties
   * @throws SQLException if the query fails
   */
  public List getDriverProperties(final String url)
    throws SQLException
  {
    List driverProperties = new ArrayList();
    Driver driver = DriverManager.getDriver(url);
    if (driver != null)
    {
      DriverPropertyInfo[] info = driver.getPropertyInfo(url, null);
      if (info != null)
        driverProperties = Arrays.asList(info);
    }

    return driverProperties;
  }

この回答への補足

元環境にてEclipseのサーバー関連の設定・操作を行っていたところ、正常に動作するようになりました。残念ながら、原因を特定するに至っていません。週末、不具合の再現に取り組んでみますが、Eclipseの理解不足が根幹にありました。
いろいろありがとうございました。
取り急ぎご報告とお礼まで。

補足日時:2009/05/15 02:18
    • good
    • 0
この回答へのお礼

Yanchさん、ご連絡ありがとうございます。
ソースまで助かります(下記の理由で、別途利用させていただきます)。

全く同じモジュールで、Eclipseからの実行時に発生する本障害が、
Tomcatに配備(※)した場合には発生せず、日本語mdbから正しく
情報を得ることができることが確認できました。

プログラムの問題ではなく、Eclipse 3.4.2の環境設定に
まずい部分があるのだという仮定で、続けて調べています。
週末に XP/2000を用意して、そこで同じEclipseを立ち上げて
マシン環境ではないことも確認してみる予定です。

遅くなりましたが、経過報告まで。

※EclipseにてWARファイルにエクスポートして、Tomcatのmanagerで配備。

お礼日時:2009/05/13 21:20

S0002 Base table not found


と言う事みたいですね。

DB接続時に文字コードとかしていしてみたらどうでしょう。

この回答への補足

最終報告
すでに報告済みですが、Eclipseの使い方の問題という認識です。実は既存プロジェクトをインポートし、一部修正のうえビルドし動作確認をしていました。Eclipseの文字コードのデフォルトUTF-8が、M932で記述された既存プロジェクトにそのまま作用し、その結果日本語文字テーブル、フィールド名が化けていたのではないかと推測しています。ただ、WARでエクスポートしたあとTomcatに配備したら正常に動作したことの説明がつくのか疑問でもあります。なぜなら、classファイル(JDBCはJSPではなくBeanで実装しています。)はEclipse側でコンパイル済みのはずだからです。
最近では、インポートしたあと、そのプロジェクトの文字コードをUTF-8からM932に修正することで事なきを得ています。
ODBC あるいは MDB側で、実際にJDBCから発行されたSQLをログなりフックするなりして確認をすれば良かったと思うのですが、その方法の調査は後日の課題とし、このスレッドを閉じさせていただきます。
ご協力いただきました諸兄に感謝申し上げます。

補足日時:2009/05/23 18:16
    • good
    • 0
この回答へのお礼

Yanchさま ご回答ありがとうございます。

>S0002 Base table not found

上を手掛かりに「ODBCエラーメッセージ」が見つかりました。
http://msdn.microsoft.com/ja-jp/library/aa937531 …


>DB接続時に文字コード

「JDBC API 入門>Connection>2.1.4 "odbc" のサブプロトコル」
http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ …
に、
 jdbc:odbc:<data-source-name>[;<attribute-name>=<attribute-value>]*
とあります。設定は
1.URLの拡張
  url="jdbc:odbc:jsys;characterEncoding=SJIS";
2.Properties の利用
  Properties info=new Properties();
  info.setProperty("characterEncoding", "SJIS");
  con = DriverManager.getConnection(url,info);
でよいかと思うのですが、いかんせん
文字コードを設定する場合の 属性名・値の組が見つかりません。
ちなみに、上例は玉砕でした。

お礼日時:2009/05/11 02:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!