2015-04-19 2 views
2

Я выполнил команду select и распечатал результат в system.out, используя код ниже. получал ожидаемый результат с неверной ошибкой курсора. не могли бы вы рассказать, почему эта ошибка возникла после печати ожидаемого результата и как его исправить? Код:Получение недопустимого исключения состояния курсора в java

try 
     { 
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
      String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + "path"; 
      conn = DriverManager.getConnection(url); 
    stmt = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY); 
    String select="SELECT DISTINCT col1,col2 FROM Tablename";      
    ResultSet rs = stmt.executeQuery(select); 
    ResultSetMetaData rsmd = rs.getMetaData(); 
    int columnsNumber = rsmd.getColumnCount();     
    String columnValue;           
    while (rs.next()) 
    { 
    for (int i = 1; i <= columnsNumber; i++) {       
     columnValue= rs.getString(i); 
     System.out.print(columnValue+" "); 
     }     
    } 
} 
catch(SQLException exc){ 
      exc.printStackTrace(); 
} 

output: 

    test1 result1 
    test2 result2 
    test3 result3 
    java.sql.SQLException: [Microsoft][ODBC Driver Manager] Invalid cursor state 
     at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6964) 
     at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7121) 
     at sun.jdbc.odbc.JdbcOdbc.SQLGetDataString(JdbcOdbc.java:3914) 
     at sun.jdbc.odbc.JdbcOdbcResultSet.getDataString(JdbcOdbcResultSet.java:5697) 
     at sun.jdbc.odbc.JdbcOdbcResultSet.getString(JdbcOdbcResultSet.java:353) 
+0

Показать StackTrace за полный Exception или на какой из строк кода броска этого исключения? –

+0

test1 Result1 test2 result2 java.sql.SQLException: [Microsoft] [ODBC Driver Manager] Invalid состояние курсора test7 result7 test8 result8 в sun.jdbc.odbc.JdbcOdbc.createSQLException (JdbcOdbc.java:6964) в sun.jdbc.odbc.JdbcOdbc.standardError (JdbcOdbc.java:7121) на sun.jdbc.odbc.JdbcOdbc.SQLGetDataString (JdbcOdbc.java:3914) на sun.jdbc.odbc.JdbcOdbcResultSet.getDataString (JdbcOdbcResultSet.java: 5697) \t в sun.jdbc.odbc.JdbcOdbcResultSet.getString (JdbcOdbcResultSet.java:353) \t в NewJFrame.btn_refreshActionPerformed (NewJFrame.java:995) –

+0

на этот раз я получаю Invalid курсор состояние ошибки в середине отказа положите (ref после результата2) - не могли бы вы помочь мне решить проблему? –

ответ

2

Я смог воссоздать вашу проблему. Похоже, что это «неудачное поведение» моста JDBC-ODBC и драйвера Access ODBC при работе с SELECT DISTINCT ... запросами и ResultSet.TYPE_SCROLL_SENSITIVE.

Следующая Клюге, кажется, работает вокруг вопроса для меня:

String select="SELECT * FROM (SELECT DISTINCT FirstName,LastName FROM Clients)"; 

Переход от ResultSet.TYPE_SCROLL_SENSITIVE к ResultSet.TYPE_FORWARD_ONLY также появляется, чтобы избежать этой проблемы.

Однако, поскольку мост JDBC-ODBC устарел и был удален из Java 8, вы можете вместо этого использовать драйвер JDBC UCanAccess. Для получения дополнительной информации см

Manipulating an Access database from Java without ODBC

+0

Большое спасибо Горд Томпсон. теперь он работает отлично :) –

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