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 中运行此查询,它们什么都不返回(因为它们应该返回 NOTHING,因为正在查询的事件编号不存在)。
  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 循环被执行并且“Something is here”被打印出来。

我在这里想念什么?我觉得这是相对明显的,我需要退后一步,让其他人关注这一点,我相信。感谢帮助。

厘米

4

1 回答 1

0

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

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

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

我希望更换驱动程序可以解决您的问题。

编辑在此处
阅读有关网站上假定的驱动程序的信息。在描述有关驱动程序的某些行之后,它说明了以下缺点:JDBC-ODBCOracleJDBC-ODBC

缺点:不适用于大规模应用。性能会受到影响,因为从 JDBC 到 ODBC 的转换工作会产生一些开销。不支持 Java 的所有功能。用户受限于底层 ODBC 驱动程序的功能。

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

于 2013-01-28T20:59:26.640 回答