さらに個別にしてテストしてみたところ、sun/jdbc と sun/security/action/LoadLibraryAction.class のみにして sun の見えるフォルダから、"C:\pleiades\java\8\bin\jar.exe" cvf jdbc.jar sun としても動作しました。あくまで対症療法なので、問題が出る可能性は残っています。ただ、sun の他のクラスを使っている場合はこの方法を取ったほうがいいと言うところです。Java 7 までは、rt.jar の中に、sun/jdbc がありますが、java 8 では、jdbc を含めたいくつかが削除されています。そこで、 Java 7 の sun 以下を全て jdbc.jar として作成しなおして、プロジェクトのビルドパスで外部参照します。さらに、Java 7 までしかない JdbcOdbc.dll を Java 8 の jre/bin にコピーすると以前と同じように使えるはずです。Pleiades を使えば、java フォルダに 6 と 7 と 8 があるので、テストはすぐ可能です。 1) Java 7 の rt.jar を rt.zip にリネームして解凍 2) sun の見えるフォルダで、『"C:\pleiades\java\8\bin\jar.exe" cvf jdbc.jar sun』 ※ Pleiades の Java 8 の jar.exe を使用しています 3) ビルド・パスのライブラリタブの外部 jar で jdbc.jar を参照 4) JdbcOdbc.dll を Java 8 側にコピー 各 DB の JDBC ドライバ あればそちらを使うほうが今後は良いと思いますが、全てのデーベースに JDBC ドライバがあるとは限らないので、イザと言う時の為に検証しておいたほうがいいかもしれません MySQL でのテストコード ※ WindowBuilder の JFace のボタンクリックからの処理です
Button btnNewButton = new Button(container, SWT.NONE); btnNewButton.addSelectionListener(new SelectionAdapter() { @Override public void widgetSelected(SelectionEvent ex) { boolean ret = true; Connection con = null; Statement stmt = null; ResultSet rset = null; String DriverName = "sun.jdbc.odbc.JdbcOdbcDriver"; String connectionString = "Provider=MSDASQL" + ";Driver={MySQL ODBC 5.3 Unicode Driver}" + ";SERVER=localhost" + ";DATABASE=lightbox" + ";UID=root" + ";PWD=パスワード文字列" + ";Charset=cp932" + ";"; // 日本語設定用プロパティ Properties prop = new Properties(); prop.put("charSet", "MS932"); System.out.println(connectionString); // 接続 try { Class.forName( DriverName ); con = DriverManager.getConnection( "jdbc:odbc:" + connectionString,prop ); stmt = con.createStatement(); } catch( Exception e ) { System.out.println(e.getMessage()); ret = false; } // 接続失敗 if ( !ret ) { return; } System.out.println("接続成功"); // SQL 作成 String Query = "select * from 社員マスタ where 社員コード = '0001'"; try { rset = stmt.executeQuery ( Query ); ret = rset.next(); } catch( SQLException e ) { System.out.println(e.getMessage()); ret = false; } // データが存在しないので処理終了 if ( !ret ) { return; } System.out.println("SQL実行成功"); try { System.out.println( rset.getString( "氏名" ) ); } catch( SQLException e ) { System.out.println(e.getMessage()); } System.out.println("列データ取得成功"); try { stmt.close(); con.close(); } catch( SQLException e ) { System.out.println(e.getMessage()); } } }); btnNewButton.setBounds(205, 10, 81, 28); btnNewButton.setText("New Button");
Windows の日本語の環境の場合、ドライバ側がでいろいろ考慮されているようなので、キャラクタセットの指定が難解です。この環境では、MySQL が UTF-8 で、ソースコードが UTF8N ですが、prop.put("charSet", "MS932"); を指定しないと、日本語のテーブル名を理解してもらえません。まだ、ODBC ドライバ側の Charset=cp932 が無いと、読み込んだデータの日本語部分が使えません。他の組み合わせはうまく行きませんでした。おそらく、JdbcOdbc.dll の都合と、ODBC ドライバの都合だと思われます。 cp932 は、sjis でもかまいませんが、cp932 のほうが多くの文字をカバーするはずです。 関連する記事 Java sun.jdbc.odbc.JdbcOdbcDriver から Microsoft Access Java sun.jdbc.odbc.JdbcOdbcDriver から Microsoft Excel 日本語 Eclipse 4.4 Pleiades で WindowBuilder