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

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)

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

A 回答 (2件)

■まず、文字コードの変換は不要ではないでしょうか(というか、これでは変換になっていないと思いますが・・・)


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

この回答への補足

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

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
    • good
    • 0

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



Windows XP SP3+JDK 1.6u17+MDAC3.5sp1で動かしたのが添付画像。
「テーブル名が日本語だとクエリーを実行して」の回答画像2
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/12/07 11:34

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