• ベストアンサー

テーブル名が日本語だとクエリーを実行して結果を取得したときにエラーになる。

import java.sql.*; import java.io.*; public class Main { public static void main(String[] args) { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); String cString = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=c:/hello.mdb"; Connection con = DriverManager.getConnection(cString, "", ""); Statement stmt = con.createStatement(); final String shiftJIS = "Shift_JIS"; String sql = encode("SELECT * FROM ハローテーブル",shiftJIS); ResultSet rs = stmt.executeQuery(sql); while(rs.next()){ int no = rs.getInt("No"); String lang = rs.getString("言語"); String msg = rs.getString("メッセージ"); System.out.println(no + " " + lang + " " + msg); } stmt.close(); con.close(); } catch (Exception e) { e.printStackTrace(); } } static String encode (final String sql, final String charset) throws UnsupportedEncodingException { return sql != null ? new String(sql.getBytes(), charset) : null; } } 上記のプログラムで以下の結果を出力したいです。 1  日本語  こんにちは世界 2  英語   Hello Word しかし、以下のエラーが表示されます。 java.sql.SQLException: [Microsoft][ODBC Microsoft Access Driver] ??̓e?[?u???܂??̓N?G?? '繝上Ο繝シ' ?????‚???܂???ł????B???̃e?[?u????N?G???????݂??Ă??邱?ƁA?܂??͖??O???????????Ƃ??m?F???Ă????????B at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6957) at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7114) at sun.jdbc.odbc.JdbcOdbc.SQLExecDirect(JdbcOdbc.java:3110) at sun.jdbc.odbc.JdbcOdbcStatement.execute(JdbcOdbcStatement.java:338) at sun.jdbc.odbc.JdbcOdbcStatement.executeQuery(JdbcOdbcStatement.java:253) at javaapplication1.Main.main(Main.java:34) 文字コードの変換がうまくいかないのだと思いますがどうすれば良いかわかりません。 どのようにしたら解決するでしょうか? またおそらくクエリーを実行して結果の取得の部分以外にも データが日本語なので値の取得の部分で希望の結果にならないと思います。 どのようにすれば良いでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.2

No.1さんのいうとおり、クエリやフィールド名を直書きで、正常に動作するみたいです。 Windows XP SP3+JDK 1.6u17+MDAC3.5sp1で動かしたのが添付画像。

a1gdx2s
質問者

お礼

回答ありがとうございます。 いままでjavaプログラムの実行結果はNetBeansの出力欄で確認していました。 コマンドプロンプトで確認したら正常に動作しました。

その他の回答 (1)

  • kztk
  • ベストアンサー率53% (59/110)
回答No.1

■まず、文字コードの変換は不要ではないでしょうか(というか、これでは変換になっていないと思いますが・・・) 素直に、SQLをそのままで。 ResultSet rs = stmt.executeQuery("SELECT * FROM ハローテーブル"); ■次にエラーが文字化けしてわからないので、例外発生時にスタックトレースを取るのではなく、getErrorCode()、getSQLState()を表示させてみてはどうでしょうか。

a1gdx2s
質問者

補足

回答ありがとうございます。 回答を参考にして以下の部分を変更しました。 final String shiftJIS = "Shift_JIS"; String sql = encode("SELECT * FROM ハローテーブル",shiftJIS); ResultSet rs = stmt.executeQuery(sql); ↓ ResultSet rs = stmt.executeQuery("SELECT * FROM ハローテーブル"); catch (Exception e) { e.printStackTrace(); } ↓ catch (SQLException y){ System.out.println(y.getSQLState()); System.out.println(y.getErrorCode()); } catch (Exception e){ e.printStackTrace(); } static String encode (final String sql, final String charset) throws UnsupportedEncodingException { return sql != null ? new String(sql.getBytes(), charset) : null; } 上記の部分を削除 実行結果は S0002 -1305 と表示されました。 このSQLStateとErrorCodeはどのような意味を表しているのでしょうか? またどのようにしたら解決するのでしょうか? データベースのテーブル名とデータの値が英語ならErrorが起こらないのかもしれませんが日本語を使いたいのでお願いします。

関連するQ&A