1

私が取り組んでいる簡単なコードがあります:

import java.sql.*;

class ODBC  
{
MyConnection myCon;
Connection jdbcConnection;
ResultSet rs;
String sql;
PreparedStatement stmt;

public ODBC() throws Exception {
    init();
}

public void init() throws Exception{
    myCon = new MyConnection();     
    jdbcConnection = myCon.getConnection();
}

public void runQuery() throws SQLException {
    sql = "SELECT DISTINCT HELPDESK_CASE.INCIDENT_NUMBER, "
            + "HPD_AUDIT.AUDIT_DATE, HPD_AUDIT.AUDIT_FIELD, "
            + "HELPDESK_CASE.DETAILED_DESCRIPTION, "
            + "HPD_AUDIT.AFTER_VALUE, "
            + "HELPDESK_CASE.DESCRIPTION "
            + "FROM HELPDESK_CASE INNER JOIN "
            + "HPD_AUDIT ON HELPDESK_CASE.INCIDENT_NUMBER "
            + "= HPD_AUDIT.INCIDENT_NUMBER "
            + "WHERE (((HELPDESK_CASE.INCIDENT_NUMBER)='INC001001837949') "
            + "AND ((HPD_AUDIT.AUDIT_FIELD)='Assigned Group')) "
            + "ORDER BY HELPDESK_CASE.INCIDENT_NUMBER, "
            + "HPD_AUDIT.AUDIT_DATE"; 
    stmt = jdbcConnection.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE );
    rs = stmt.executeQuery();
    while(rs.next()){
        System.out.println("Something is here");
    }
}

public static void main (String args[]) throws Exception 
{
    ODBC odbc;
    odbc = new ODBC();
    odbc.runQuery();
}

class MyConnection {
    public Connection getConnection() throws Exception 
    {
        String URL = "jdbc:odbc:corpp05";
        Connection c = DriverManager.getConnection(URL, "remro", "*****"); 
        return c;
    }
}
}

次の動作がわかりません。

  1. 同じ JDBC ドライバーを使用して MySQL と Access でこのクエリを実行すると、何も返されません (クエリ対象のインシデント番号が存在しないため、何も返されないため)。
  2. このプログラムの他の領域 (このサンプル スニップの外側) で、resultSet.previous() resultSet.beforeFirst()などを呼び出す機能が必要です。そのため、前後にスクロールできる必要があります。
  3. 次のようにpreparedStatementを使用すると:

    stmt = jdbcConnection.prepareStatement(sql);

while ループは、予想される動作として実行されることはありませんが、次のように PreparedStatement を使用すると、次のようになります。

stmt = jdbcConnection.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE );

(TYPE_SCROLL_INSENSITIVEが必要なので必要です)whileループが実行され、「何かがここにあります」が出力されます。

ここで何が欠けていますか?一歩下がって、これに別の目を向ける必要があることは比較的明らかだと思います。助けに感謝します。

Cmres

4

1 に答える 1

0

thin使用している oracle のバージョンに最も適したドライバを oracle サイトからダウンロードします。jarそのファイルを Eclipse 外部 jar ファイル アーカイブに追加します。すべての設定が完了したら、次のように接続できます。

DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());                         
con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","user","****"); 

あなたの場合は2を返すのでjdbc.getTransactionIsolation()、ダーティリードの可能性は排除されます。

ドライバーを変更することで問題が解決することを願っています。

編集Web サイトで想定されているドライバーについては、こちら
をお読みください。ドライバーについて説明する際のいくつかの行の後に、次の短所が示されます。JDBC-ODBCOracleJDBC-ODBC

短所: 大規模なアプリケーション向けではありません。JDBC から ODBC への変換作業に関連するオーバーヘッドがあるため、パフォーマンスが低下します。Java のすべての機能をサポートしているわけではありません。ユーザーは、基になる ODBC ドライバーの機能によって制限されます。

したがって、パッケージJDBC-ODBCによって提供される機密性の高い API を介してデータベース トランザクションまたはその他の重要なデータベース機能を実装するためのドライバーのみにアプリケーションが基づいている場合、いくつかの重大な問題が発生する可能性があると考えるのに十分な理由が得られます。java.sql

于 2013-01-28T20:59:26.640 に答える