2009-04-10 2 views
0

Я работаю над проектом в оракуле 9i. У меня возникла проблема с подключением 10.1.3 к загрузке определенной строки в таблицу. Оказывается, драйвер jdbc, на который опирается опилка, действует очень забавно. Возможно, кто-то здесь может помочь ...Когда два столбца выглядят одинаково в оракуле?

У меня есть таблица с именем: crazytable. У него есть столбец: «Номер версии ver_num (19), а не null default 0». Этот столбец был добавлен в таблицу как часть оригинальной вставки несколько лет назад. Когда я выбираю любую запись (см. Ниже для кода подключения jdbc) от сумасшедшего и пытаюсь выполнить rs.getLong (colIndex), все работает отлично. Однако, если я делаю rs.getObject (colIndex), я получаю трассировку стека:

java.lang.ArrayIndexOutOfBoundsException: 1 
    at oracle.sql.NUMBER.toBigDecimal(NUMBER.java:651) 
    at oracle.jdbc.dbaccess.DBConversion.NumberBytesToBigDecimal(DBConversion.java:2805) 
    at oracle.jdbc.driver.OracleStatement.getBigDecimalValue(OracleStatement.java:4539) 
    at oracle.jdbc.driver.OracleStatement.getObjectValue(OracleStatement.java:5666) 
    at oracle.jdbc.driver.OracleStatement.getObjectValue(OracleStatement.java:5622) 
    at oracle.jdbc.driver.OracleResultSetImpl.getObject(OracleResultSetImpl.java:739) 
    at oracle.jdbc.driver.OracleResultSet.getObject(OracleResultSet.java:1470) 
    stacktrace truncated to protect my poor code... 

я могу взять другую таблицу, позволяет называть его: sanetable и запустить этот же запрос к столбцу с таким же именем и type "ver_num number (19) not null default 0". И rs.getLong (colIndex) и rs.getObject (colIndex) работают нормально.

Ни один столбец не участвует в ограничении или индексе. Я пробовал драйвер oracle 9.2.0.8, 9.2.0.5, 9.2.0.1, даже 10. * (который не будет работать).

Кто-нибудь знает что-нибудь о том, что я могу здесь сделать?

Это мой базовый код подключения. Единственное различие между успешными вызовами является конкретной таблицей в вопросе:

  Class.forName(oracle.jdbc.OracleDriver.class.getName()); 
    String url = "jdbc:oracle:thin:@IPADDRESS:PORT:INSTANCE"; 
     Connection conn = null; 
     ResultSet rs = null; 
     try { 
      conn = DriverManager.getConnection(url, "user","pass"); 
      PreparedStatement prepareStatement = conn.prepareStatement(
        "select distinct ver_num " + 

        "FROM [crazytable|sanetable] " 
        ); 
      rs = prepareStatement.executeQuery(); 
      assertNotNull(rs); 
      while (rs.next()) { 
       ResultSetMetaData md = rs.getMetaData(); 
       for (int i = 1; i <= md.getColumnCount(); i++) { 
        String key = md.getColumnLabel(i); 
        Object value = rs.getLong(key); 
        System.out.println(key+" : "+value 
          +" was null: "+rs.wasNull() 
          +" type: "+ rs.getType() 
          +" class: "+ md.getColumnClassName(i)); 
       } 
      } 
     } finally { 
      if (rs != null) { 
       rs.close(); 
      } 
      if (conn != null) { 
       conn.close(); 
      } 
     } 

редактировать: Драйвер можно найти на этой странице: http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc9201.html

+0

Не могли бы вы упомянуть имя файла драйвера? –

ответ

0

Хорошо, я думаю, что я понял это. Я просматривал некоторые другие вопросы и заметил, что есть другие драйверы типа 4 оракула. Одним из них является DataDirect (http://datadirect.com). Я использовал пробную версию своего драйвера, и он смог вернуть rs.getObject (intIndex).

Оценка: -1.6777120E-27.

Так что rs.getLong() округлялось до нуля, но BigDecimal видел десятичную часть и выдавал исключение.

Возможно, это связано с тем, что драйвер oracle скомпилирован с помощью jdbc1.4 vs, что-то более новое для datadirect.

Смежные вопросы