• 締切済み

JDBC-ODBC-MDB(日本語テーブル・カラム名)アクセスで、ODBC -1305エラー

日本語のテーブル名・カラム名を使用した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)

みんなの回答

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.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;   }

rivriv
質問者

お礼

Yanchさん、ご連絡ありがとうございます。 ソースまで助かります(下記の理由で、別途利用させていただきます)。 全く同じモジュールで、Eclipseからの実行時に発生する本障害が、 Tomcatに配備(※)した場合には発生せず、日本語mdbから正しく 情報を得ることができることが確認できました。 プログラムの問題ではなく、Eclipse 3.4.2の環境設定に まずい部分があるのだという仮定で、続けて調べています。 週末に XP/2000を用意して、そこで同じEclipseを立ち上げて マシン環境ではないことも確認してみる予定です。 遅くなりましたが、経過報告まで。 ※EclipseにてWARファイルにエクスポートして、Tomcatのmanagerで配備。

rivriv
質問者

補足

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

  • Yanch
  • ベストアンサー率50% (114/225)
回答No.1

S0002 Base table not found と言う事みたいですね。 DB接続時に文字コードとかしていしてみたらどうでしょう。

rivriv
質問者

お礼

Yanchさま ご回答ありがとうございます。 >S0002 Base table not found 上を手掛かりに「ODBCエラーメッセージ」が見つかりました。 http://msdn.microsoft.com/ja-jp/library/aa937531(SQL.80).aspx >DB接続時に文字コード 「JDBC API 入門>Connection>2.1.4 "odbc" のサブプロトコル」 http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/guide/jdbc/getstart/connection.html#996856 に、  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); でよいかと思うのですが、いかんせん 文字コードを設定する場合の 属性名・値の組が見つかりません。 ちなみに、上例は玉砕でした。

rivriv
質問者

補足

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