Унаследованный метод execute query не может быть использован в этом подклассе - PullRequest
0 голосов
/ 02 мая 2019

Скопировал существующий код, который сделал обновление, для выполнения запроса.

PreparedStatement pstmt2  = connection.prepareStatement(sql);              
pstmt2.executeUpdate();

стал

PreparedStatement pstmt2  = connection.prepareStatement(sql);              
pstmt2.executeQuery(sql);

При выполнении кода получено это исключение. Я подозреваю, что это исключение создается только sybase.

Ответы [ 2 ]

0 голосов
/ 02 мая 2019

Цитировать из документации Statement.executeQuery(String):

Выдает
SQLException - если возникает ошибка доступа к базе данных, это метод вызывается по закрытому Statement заданному оператору SQL создает объект ResultSet, метод вызывается PreparedStatement или CallableStatement

Другими словами, использование executeQuery(String) (или любого другого execute метода, принимающего строку) является неправильным и должно вызывать исключение во всех JDBC-совместимых драйверах. Таким образом, исключение Sybase здесь является правильным и ожидаемым.

Это требование было введено в JDBC 4.1 (Java 7), ранее спецификация JDBC явно не содержала это требование, и, в частности, MySQL (и iirc MariaDB) Connector / J, к сожалению, до сих пор игнорируют эту часть спецификации.

Вы должны использовать

try (PreparedStatement pstmt = connection.prepareStatement(sql)) {
    // set parameters
    try (ResultSet rs = pstmt.executeQuery()) {
        // process result set
    }
}

или (если вы не используете параметризованные операторы):

try (Statement stmt = connection.createStatement();
     ResultSet rs = stmt.executeQuery(sql)) {
    // process result set
}
0 голосов
/ 02 мая 2019

Кредит экспертам - обмен для руководства - используйте метод createStatement, а не prepareStatement.

SQL должен быть следующим: оператор pstmt2 = dbconn2.createStatement ();ResultSet result = pstmt2.executeQuery (sql);

...