5

正しく動作しているように見える次のコードがありますが、personCode 文字列の値が表示されません。PERSON_CODE は、Oracle 9i データベースの VARCHAR2 です。

プロジェクトに Java SE 1.7 と ojdbc7.jar を使用しています。私はJavaが初めてなので、誰か助けてもらえますか?

private static void GetEmployee(String input) {
String output = "";
Connection con=null;
PreparedStatement stmt = null;
String sql ="SELECT ALL BADGE_NUMBER, PERSON_CODE FROM BADGETABLE WHERE BADGE_NUMBER = ?";

try {
    //load driver
    Class.forName("oracle.jdbc.driver.OracleDriver");
    con=DriverManager.getConnection("jdbc:oracle:thin:username/password@host:1521:database");

    //declaring statement
    stmt = con.prepareStatement(sql);
    stmt.setString(1, input);

    // execute query
    ResultSet rows = stmt.executeQuery();

    int i = 0;
    while(rows.next()) {
        i++;
        String badgeCode = rows.getString(1);
        String personCode = rows.getString(2);
        String personType = rows.getString(3);
        System.out.println("Badge number: " + badgeCode);
        System.out.println("Employee ID: " + personCode);
    }
    System.out.println("Number of results: " + i);


    rows.close();    // All done with that resultset
    stmt.close();  // All done with that statement
    con.close();  // All done with that DB connection


}
catch (SQLException e) {
    System.err.println(e);
} 
catch (ClassNotFoundException e) {
    System.err.println(e);
}

return;
}
4

6 に答える 6

4

次を使用して、この同じ問題に遭遇しました。

  1. Oracle 9i Enterprise Edition 64 ビット (JServer リリース 9.2.0.1.0 - プロダクション)
  2. JDBC 12.1.0.1.0 - ojdbc7.jar
  3. Java OpenJDK 64 ビット、1.7.0_09-icedtea

次のようなテーブルを使用します。 create table person ( first_name varchar2(60) );

そして、sqlline を使用して次のようなクエリを実行します。 select first_name, cast(substr(first_name,0,1) as char) from person;

["","S"] の結果セットになります。

他の人にとって問題であることが判明したため、クラスパスに他の Oracle jar はありませんでしたが、ojdbc7.jar から ojdbc6_g.jar に切り替えると、この問題は解決しました。これは、12c ダウンロード セクションにあるドライバー バージョン 11.2.0.3.0 です。

于 2014-02-23T22:31:16.473 に答える
2

この問題を解決したことを喜んで報告しますが、実際には、問題は実際には Glassfish サーバーにあったのに、私のコードで非常に長く苦痛を伴う検索でした。

このサイトのどこかで、誰かが同様の問題を抱えていて、 ojdbc18???.jar という名前の jar を削除したことを読みました。これを検索したところ、何も見つからなかったので、次に進みました。

ほとんどの髪の毛を抜いた後、Web サーバーをブラウジングし始めることにしました。確かに、WEB サーバーの lib ディレクトリに他のjar があり、それが私のアプリに表示されます。

これらの jar は ojdbc14???.jar でした。完全にフリーク。それらのojdbc14を削除するとすぐに、すべてが正常に機能しました。

そのために、クラスパスを検索し、そのようなjarが見つからないことを確認してください。

がんばれ、ニック

于 2013-08-14T14:50:26.467 に答える
2

あなたのクエリを見てください:

String sql = "SELECT ALL BADGE_NUMBER, PERSON_CODE FROM BADGETABLE WHERE BADGE_NUMBER = ?";

以下のコードは Exception をスローします:

String badgeCode = rows.getString(1);
String personCode = rows.getString(2);
// there is no third column in your resultset
String personType = rows.getString(3); 

クエリを次のように変更できます (列名を使用したくない場合)。

String sql = "SELECT * FROM BADGETABLE WHERE BADGE_NUMBER = ?";

または、3 番目の列を指定します。

String sql = "SELECT ALL BADGE_NUMBER, PERSON_CODE ,PERSON_TYPE FROM BADGETABLE WHERE BADGE_NUMBER = ?";

列名を使用してデータを取得します。

String badgeCode = rows.getString("BADGE_NUMBER");
String personCode = rows.getString("PERSON_CODE");
String personType = rows.getString("PERSON_TYPE");

また、close()ステートメントをfinallyブロックの下に移動します。

} finally {
 try { rows.close(); } catch (Exception e) {  }
 try { stmt.close(); } catch (Exception e) {  }
 try { con.close(); } catch (Exception e) {  }
}
于 2013-07-08T15:59:44.117 に答える
1

この問題は、あまり知られていない ojdbc8.jar ドライバーと Oracle 9i の間の非互換性です。ドライバー ojdbc8.jar を ojdbc6.jar に置き換えると、問題が解決されます。Weblogic12 を使用して同じ問題が発生しました。データソースを作成するには、Weblogic12 のドライバーを置き換える必要がありました。問題を示す小さなテストのリンクを次に示します。

https://github.com/paulog29/jdbc-oracle9i

幸運を。

于 2021-03-26T13:31:42.337 に答える
0

SQLの を無視するallと、基本的な問題は、SQL クエリが 2 のみを選択するときに、3 つのフィールドを取得しようとすることです。

すべてのBADGE_NUMBERを選択、BADGETABLEからPERSON_CODE ...

于 2013-07-08T16:00:24.453 に答える