こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

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)

文字コードの変換がうまくいかないのだと思いますがどうすれば良いかわかりません。
どのようにしたら解決するでしょうか?
またおそらくクエリーを実行して結果の取得の部分以外にも
データが日本語なので値の取得の部分で希望の結果にならないと思います。
どのようにすれば良いでしょうか?

投稿日時 - 2009-12-06 02:07:11

QNo.5501454

すぐに回答ほしいです

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

No.1さんのいうとおり、クエリやフィールド名を直書きで、正常に動作するみたいです。

Windows XP SP3+JDK 1.6u17+MDAC3.5sp1で動かしたのが添付画像。

投稿日時 - 2009-12-07 01:47:06

お礼

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

投稿日時 - 2009-12-07 11:34:03

ANo.2

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

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

投稿日時 - 2009-12-06 10:38:25

補足

回答ありがとうございます。
回答を参考にして以下の部分を変更しました。

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が起こらないのかもしれませんが日本語を使いたいのでお願いします。

投稿日時 - 2009-12-06 16:18:13

あなたにオススメの質問