- - PR -
AppletからOracle接続
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2003-11-10 13:26
先日は、色々とありがとうございました。大変勉強になりました。
AppletからOracleに接続してみたいと思いサンプルプログラムを 作ってみたのですが、「Start:アプレットは初期化できません。」とエラーが出て 止まってしまいます。これはどのようなエラーなのでしょうか? Oracleに接続している部分が少し不安なのですが、このような感じでよろしいのでしょうか? ご意見をお聞かせいただけると嬉しく思います。よろしくお願い致します。 import java.awt.*; import javax.swing.*; import javax.swing.table.*; import java.sql.*; import java.util.*; public class testdb extends JApplet { TableModel model; public void init() { PersistenceManager persistMgr = new PersistenceManager(); try { ResultSet rs = persistMgr.executeSQL("SELECT * FROM test;"); model = new DataModel(rs); } catch(SQLException e) { e.printStackTrace(); return; } JTable table = new JTable(model); JScrollPane scrollPanel = new JScrollPane(table); Container cont = getContentPane(); cont.add(scrollPanel); } } class PersistenceManager { Statement stmt; PersistenceManager() { try { Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); Connection con = DriverManager.getConnection( "jdbc:oracle:thin:@192.168.0.1:1521:oracle","user","password"); stmt = con.createStatement(); }catch(Exception e){ e.printStackTrace(); } } ResultSet executeSQL(String str) throws SQLException { return stmt.executeQuery(str); } } class DataModel extends AbstractTableModel { String[] columnNames; Vector rows = new Vector(); DataModel(ResultSet rs) throws SQLException { ResultSetMetaData metaData = rs.getMetaData(); int numberOfColumns = metaData.getColumnCount(); columnNames = new String[numberOfColumns]; for(int column = 0; column < numberOfColumns; column++) { columnNames[column] = metaData.getColumnLabel(column + 1); } rows = new Vector(); while (rs.next()) { Vector newRow = new Vector(); for (int i = 1; i <= getColumnCount(); i++) { newRow.addElement(rs.getObject(i)); } rows.addElement(newRow); } } public String getColumnName(int column) { if (columnNames[column] != null) { return columnNames[column]; }else{ return ""; } } public int getColumnCount() { return columnNames.length; } public int getRowCount() { return rows.size(); } public Object getValueAt(int aRow, int aColumn) { Vector row = (Vector)rows.elementAt(aRow); return row.elementAt(aColumn); } } | ||||
|
投稿日時: 2003-11-10 13:37
使用しているOSは?
実行環境のバージョンは? 出力された例外は? もし、Windowsを使用しているなら、Java Plug-inのコントロールパネルでコンソール表示の切り替えを行うことができます。ここで、コンソール表示をONにし、出力される例外も報告していただけると、より回答しやすいと思います。 | ||||
|
投稿日時: 2003-11-10 14:01
すみません。大事な事を書き忘れていました。。。
OSはWindows2000です。 接続先のデータベースはOracle8.1.7です。 JDBCのドライバは、Oracleのホームディレクトリ/jdbc/lib配下の classes12.zipをAppletのディレクトリにコピーしました。 Javaは、1.3.1_06です。 例外は、以下のように出ています。 ava.sql.SQLException: I/Oホ羌ー、ヌ、ケ。」: Connection refused(DESCRIPTION=(TMP=)(VSNNUM=135294976)(ERR=12505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4)))) at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:168) at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:210) at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:323) at oracle.jdbc.driver.OracleConnection.<init>(OracleConnection.java:263) at oracle.jdbc.driver.OracleDriver.getConnectionInstance(OracleDriver.java:365) at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:260) at java.sql.DriverManager.getConnection(Unknown Source) at java.sql.DriverManager.getConnection(Unknown Source) at PersistenceManager.<init>(testdb.java:34) at testdb.init(testdb.java:11) at sun.applet.AppletPanel.run(Unknown Source) at java.lang.Thread.run(Unknown Source) java.lang.NullPointerException at PersistenceManager.executeSQL(testdb.java:43) at testdb.init(testdb.java:13) at sun.applet.AppletPanel.run(Unknown Source) at java.lang.Thread.run(Unknown Source) 以上よろしくお願い致します。 | ||||
|
投稿日時: 2003-11-10 14:41
ここで、DBとコネクションを張ることが出来ずに終わっている事が原因のようですね。 この結果、ParsistenceManagerの構築が不完全のまま終わり(stmtがnullのまま)、 次いで、 return stmt.executeQuery(str); でNullPointerException発生(stmtはnullだからね)。 Applet#init()ではNullPointerExceptionは捕捉されないため、外に放出、結果「Start:アプレットは初期化できません。」って感じですね。 私はDBを触った事がないので、DBとのコネクションに関して、これ以上フォローしてあげることができません。 | ||||
|
投稿日時: 2003-11-10 17:19
確信はありませんが、ERR=12505 って、Oracleのエラー番号ではないですか?
以下Oracleのエラーメッセージマニュアルより。 TNS-12505 TNS: リスナーは接続記述子にあるSID を解決できませんでした。 原因: CONNECT_DATA のSID が、リスナーのテーブルで見つかりませんでした。 処置: 指定されたSID が正しいかどうか確認してください。現在リスナーに登録されて いるSID は、"LSNRCTL SERVICES listener name" と入力すると取得できます。これらの SID はTNSNAMES.ORA 内のSID_NAME、またはINIT.ORA 内のDB_NAME に対応 します。 _________________ | ||||
|
投稿日時: 2003-11-10 17:56
>かずさん
返答ありがとうございます。 そこがエラーの原因みたいです。色々と本当にありがとうございます。 自分でも色々調べてみたのですが、原因はまだわかっておりません。 多分、調べ方にも問題はあると思いますが。。。 >カーニーさん 返答ありがとうございます。 僕もORACLEのエラーだと思って調べていました。 リスナーは接続記述子にあるSID を解決できませんでした。と言う事は、 SIDが違うと言う事ですよね? 自分のPCからSQL PLUSを使っての接続はできるのですが。。。 他に設定する場所があると言う事なのでしょうか? よろしくお願い致します。 | ||||
|
投稿日時: 2003-11-10 18:17
JDBCドライバが正しくありません。 Oracle8iなら、JDBCドライバのファイルは「classes111.zip」です。 「classes12.zip」はOracle9i用です。 | ||||
|
投稿日時: 2003-11-10 22:27
私が以前やった時は、classes12.zipでもOracle8iに接続できましたけどね・・・。
#アプレットじゃなくてサーブレットですが。(^^; それより、エラー内容からしてSIDが違うのだと思います。 そのあたりをよく確認された方がいいのではないでしょうか? ThinドライバでOracleにJDBC接続するのは、ホスト名(IPアドレス)とポート番号、 SIDが合っていればそれ以上は何もいらないはずです。 #恐らくご存知だと思いますが、失礼を承知で追記させていただくと、 SIDとグローバルサービス名とNet8のサービス名は別物です。SQL*PLUSを使うときに 指定するのは(通常は)Net8のサービス名で、Net8の設定をするときに使うのは (通常は)グローバスサービス名です。 | ||||
