ResultSet仅对TYPE_SCROLL_INSENSITIVE,CONCUR_READ_ONLY不正确

时间:2013-01-24 16:44:30

标签: java

我有一段简单的代码:

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中运行此查询并且它们什么都不返回(因为它们应该返回NOTHING,因为查询的事件编号不存在)。
  2. 我需要能够在此程序的其他区域(在此示例片段之外)调用 resultSet.previous()resultSet.beforeFirst()等,因此需要能够向前滚动和倒退。
  3. 当我按如下方式使用preparedStatement时:

    stmt = jdbcConnection.prepareStatement(sql);

  4. while循环永远不会按预期的行为执行,但是当我按如下方式使用preparedStatement时:

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

    (因为我需要TYPE_SCROLL_INSENSITIVE,所以我需要)执行while循环并打印“Something is here”。

    我在这里缺少什么?我觉得这是相对明显的,我需要退后一步,我相信还有另一只眼睛。感谢帮助。

    Cmres

1 个答案:

答案 0 :(得分:0)

从最适合您正在使用的oracle版本的oracle站点下载thin驱动程序。在eclipse外部jar文件存档中添加jar文件。 完成所有设置后: 你可以按如下方式建立连接:

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

由于jdbc.getTransactionIsolation()在你的情况下返回2,所以消除了脏读的可能性。

我希望改变司机会解决你的问题。

修改
请阅读JDBC-ODBC网站上关于Oracle驱动程序的here。在描述有关JDBC-ODBC驱动程序的某些行之后,它告诉以下缺点:

  

缺点:不适用于大型应用程序。性能受到影响因为   有一些与翻译工作相关的开销   JDBC到ODBC。 不支持Java的所有功能。用户是   受底层ODBC驱动程序功能的限制。

因此,当应用程序完全基于JDBC-ODBC驱动程序以通过java.sql程序包提供的敏感API实现数据库事务或其他重要数据库功能时,它提供足够的理由相信某些关键问题可能会受到影响