|
Spec-Zone .ru
спецификации, руководства, описания, API
|
Эта страница затрагивает следующие темы:
Когда JDBC встречается с ошибкой во время взаимодействия с источником данных, он бросает экземпляр SQLException в противоположность Exception. (Источник данных в этом контексте представляет базу данных который a Connection объект соединяется.) SQLException экземпляр содержит следующую информацию, которая может помочь Вам определить причину ошибки:
Описание ошибки. Получите String объект, который содержит это описание, вызывая метод SQLException.getMessage.
Код SQLState. Эти коды и их соответствующие значения были стандартизированы ISO/ANSI and Open Group (X/Open), хотя некоторые коды были зарезервированы для поставщиков базы данных, чтобы определить для себя. Это String объект состоит из пяти алфавитно-цифровых символов. Получите этот код, вызывая метод SQLException.getSQLState.
Код ошибки. Это - целочисленное значение, идентифицирующее ошибку, которая вызвала SQLException экземпляр, который будет брошен. Его значение и значение специфичны для реализации и могли бы быть фактическим кодом ошибки, возвращенным базовым источником данных. Получите ошибку, вызывая метод SQLException.getErrorCode.
Причина. A SQLException у экземпляра могла бы быть причинная связь, которая состоит из один или больше Throwable объекты, которые вызвали SQLException экземпляр, который будет брошен. Чтобы переместиться по этой цепочке причин, рекурсивно вызовите метод SQLException.getCause до a null значение возвращается.
Ссылка на любые цепочечные исключения. Если больше чем одна ошибка происходит, на исключения ссылаются через эту цепочку. Получите эти исключения, вызывая метод SQLException.getNextException на исключении, которое было выдано.
Следующий метод, JDBCTutorialUtilities.printSQLException выводит SQLState, код ошибки, ошибочное описание, и причину (если есть один), содержавшийся в SQLException так же как любое другое исключение, объединенное в цепочку к этому:
public static void printSQLException(SQLException ex) {
for (Throwable e : ex) {
if (e instanceof SQLException) {
if (ignoreSQLException(
((SQLException)e).
getSQLState()) == false) {
e.printStackTrace(System.err);
System.err.println("SQLState: " +
((SQLException)e).getSQLState());
System.err.println("Error Code: " +
((SQLException)e).getErrorCode());
System.err.println("Message: " + e.getMessage());
Throwable t = ex.getCause();
while(t != null) {
System.out.println("Cause: " + t);
t = t.getCause();
}
}
}
}
}
Например, если Вы вызываете метод CoffeesTable.dropTable с DB Java как Ваш DBMS, таблица COFFEES не существует, и Вы удаляете звонок JDBCTutorialUtilities.ignoreSQLException, вывод будет подобен следующему:
SQLState: 42Y55 Error Code: 30000 Message: 'DROP TABLE' cannot be performed on 'TESTDB.COFFEES' because it does not exist.
Вместо выведения SQLException информация, Вы могли вместо этого сначала получить SQLState тогда обработайте SQLException соответственно. Например, метод JDBCTutorialUtilities.ignoreSQLException возвраты true если SQLState> равен коду 42Y55 (и Вы используете DB Java в качестве своего DBMS), который вызывает JDBCTutorialUtilities.printSQLException проигнорировать SQLException:
public static boolean ignoreSQLException(String sqlState) {
if (sqlState == null) {
System.out.println("The SQL state is not defined!");
return false;
}
// X0Y32: Jar file already exists in schema
if (sqlState.equalsIgnoreCase("X0Y32"))
return true;
// 42Y55: Table already exists in schema
if (sqlState.equalsIgnoreCase("42Y55"))
return true;
return false;
}
SQLWarning объекты являются подклассом SQLException то соглашение с предупреждениями доступа к базе данных. Предупреждения не останавливают выполнение приложения, как исключения делают; они просто предупреждают пользователя, что что-то не происходило как запланировано. Например, предупреждение могло бы сообщить, что полномочие, которое Вы попытались отменить, не отменялось. Или предупреждение могло бы сказать Вам, что ошибка произошла во время требуемого разъединения.
О предупреждении можно сообщить относительно a Connection объект, a Statement объект (включая PreparedStatement и CallableStatement объекты), или a ResultSet объект. У каждого из этих классов есть a getWarnings метод, который следует вызвать, чтобы видеть, что первое предупреждает, сообщил относительно объекта вызова. Если getWarnings возвращает предупреждение, можно вызвать SQLWarning метод getNextWarning на этом, чтобы получить любые дополнительные предупреждения. Выполнение оператора автоматически очищает предупреждения от предыдущего оператора, таким образом, они не растут. Это означает, однако, что, если Вы хотите получить предупреждения, о которых сообщают относительно оператора, следует сделать так прежде, чем Вы выполните другой оператор.
Следующие методы от JDBCTutorialUtilities иллюстрируйте, как получить полную информацию о любых предупреждениях, относительно которых сообщают Statement или ResultSet объекты:
public static void getWarningsFromResultSet(ResultSet rs)
throws SQLException {
JDBCTutorialUtilities.printWarnings(rs.getWarnings());
}
public static void getWarningsFromStatement(Statement stmt)
throws SQLException {
JDBCTutorialUtilities.printWarnings(stmt.getWarnings());
}
public static void printWarnings(SQLWarning warning)
throws SQLException {
if (warning != null) {
System.out.println("\n---Warning---\n");
while (warning != null) {
System.out.println("Message: " + warning.getMessage());
System.out.println("SQLState: " + warning.getSQLState());
System.out.print("Vendor error code: ");
System.out.println(warning.getErrorCode());
System.out.println("");
warning = warning.getNextWarning();
}
}
Наиболее распространенное предупреждение является a DataTruncation предупреждение, подкласс SQLWarning. Все DataTruncation у объектов есть SQLState 01004, указание, что была проблема с чтением или записью данных. DataTruncation методы, которым позволяют Вы узнать, в котором данные столбца или параметра были усеченными, было ли усечение на операции чтения или операции записи, сколько байтов должно было быть передано, и сколько байтов было фактически передано.
Ваш драйвер JDBC мог бы бросить подкласс SQLException это соответствует общему SQLState или состоянию распространенной ошибки, которое не связывается с определенным значением class SQLState. Это позволяет Вам записать более переносимый код обработки ошибок. Эти исключения являются подклассами одного из следующих классов:
SQLNonTransientExceptionSQLTransientExceptionSQLRecoverableExceptionСм. последний Javadoc java.sql пакет или документация Вашего драйвера JDBC для получения дополнительной информации об этих подклассах.
Следующие подклассы SQLException может также быть брошен:
BatchUpdateException бросается, когда ошибка происходит во время работы пакетного обновления. В дополнение к информации, предоставленной SQLException, BatchUpdateException обеспечивает счета обновления для всех операторов, которые выполнялись прежде, чем ошибка произошла.SQLClientInfoException бросается, когда одно или более свойств информации о клиенте не могли быть установлены на Соединении. В дополнение к информации, предоставленной SQLException, SQLClientInfoException обеспечивает список свойств информации о клиенте, которые не были установлены.