Сълзи и болка
Възможно е да възникнат грешки при изпълнение на Java програма. При работа с базата данни ще възникнат грешки. Всичко е до това кой от тях можете да предвидите и да предложите адекватно решение.
Първата голяма група грешки ще ви очаква при изпълнение на този ред:
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "secret");
Какво можете да очаквате тук?
Грешка 1. Драйверът не е намерен .
Ако получите грешката „Няма намерен подходящ драйвер за …“ , това означава, че DriverManager не може да разбере Howъв тип СУБД стои зад вашия URL. Например сте написали jdbc_mysql: instead of jdbc:mysql:
Грешка 2. Грешка при свързване .
Ако направите грешка в името на хоста, най-вероятно ще получите съобщение като „Не е известен такъв хост“ or „Неуспех на комуникационната връзка“.
Грешка 3. Името на базата данни е неправилно .
Ако сте написали грешно името на базата данни or сте се свързали с друг сървър, където тя не съществува, ще получите съобщение като „Неизвестна база данни 'supershop3'” .
Грешка 4. Грешно потребителско име or парола .
Ако сте забравor паролата на базата данни or сте я въвели неправилно, тогава най-вероятно ще получите съобщение като „Отказан достъп за потребител 'root'@'localhost' (използване на парола: ДА)” .
SQL изключение
Ако връзката с базата все пак е установена, тогава ще бъде по-интересно по-нататък. В случай на грешки при работа с базата данни, JDBC има специално изключение - java.sql.SQLException . Както и няколко негови разновидности.
Това изключение има само един допълнителен метод (в сравнение с класа Exception) - методът getSQLState(), който връща codeа на състоянието (низ), който SQL сървърът му е върнал. Обработката на грешки изглежда така:
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "secret");
try {
int rowsCount = statement.executeUpdate("DELETE FROM ‘Unemployees’");
} catch (SQLException ex) {
// If table doesn't exist
if (ex.getSQLState().compareTo("X0Y32") != 0) {
throw ex;
}
} finally {
connection.close();
}
Има стотици codeове за грешки. Можете да видите пълния списък тук .
Но понякога codeовете за грешки помагат на JDBC да разбере по-добре грешката и след това хвърля не само SQLException, но специализирано SQLException:
BatchUpdateException | Грешка при групова заявка |
DataTruncation | Често се случва при съкращаване на дълги данни |
SQLClientInfoException | Клиентът предаде параметри, които не могат да бъдат зададени на връзката: Връзка |
SQLDataException | Грешка с данни, подробностите зависят от типа на СУБД |
SQLException | Грешка при достъп до база данни or други общи грешки |
SQLFeatureNotSupportedException | СУБД не поддържа тази функционалност |
SQLIntegrityConstraintViolationException | Всички грешки с за SQLState ==22 |
SQLInvalidAuthorizationSpecException | Грешка при достъп и/or оторизация |
SQLNonTransientConnectionException | Всички грешки с за SQLState ==08 |
SQLRecoverableException | Има грешка, но тя може да бъде попequalsа с намесата на приложението |
SQLSyntaxErrorException | Грешка в синтаксиса на заявката |
SQLTimeoutException | Заявката отне твърде много време |
SQLTransactionRollbackException | Грешка по време на връщане назад на транзакция |
SQLПредупреждение | Предупреждение, издадено от СУБД |
Примери за грешки
Ако възникне грешка на етапа на сървърното приложение, обикновено тя може да бъде регистрирана и след това да бъде разгледана по-подробно. Но ако това се случи, докато приложението работи на компютъра на програмиста, тогава трябва внимателно да проучите причината за това.
Има два най-големи класа грешки при работа с база данни:
- Грешка в текста на заявката
- Грешка при работа с ResultSet
Много често може да възникне грешка в текста на заявката. Заявката може да бъде много дълга, да съдържа няколко таблици (свързани чрез JOIN) и подзаявки (SUBSELECT). Не е лесно да се намери грешка в такава заявка. Освен това заявките често се слепват от части, там се добавят данни.
Първата грешка, за която трябва да знаете, е SQLSyntaxErrorException . Такава грешка обикновено означава, че имате правописна грешка в тялото на заявката.
Да вземем нашия любим пример:
ResultSet results = statement.executeQuery("SELECT Count(*) FROM user");
results.next();
int count = results.getInt(1);
И „случайно“ изтрийте звездичката в тялото на заявката:
ResultSet results = statement.executeQuery("SELECT Count() FROM user");
results.next();
int count = results.getInt(1);
Тогава ще получим изключение:
Exception in thread "main" java.sql.SQLSyntaxErrorException:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') FROM task' at line 1
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
SQL сървърът ни казва, че е имало синтактична грешка преди FROM.
Ние внимателно разглеждаме заявката и мислим. Ако нищо не ви идва наум, а това се случва много често, тогава трябва да помолите някого да погледне Howво не е наред.
Друга популярна грешка е неправилната работа с ResultSet - резултатът от заявката. Да предположим, че сте забравor, че преди да прочетете данните, „текущият ред“ на обекта ResultSet идва преди първия ред, тогава ще имате следния code:
ResultSet results = statement.executeQuery("SELECT Count(*) FROM user");
// results.next();
int count = results.getInt(1);
Ще получите тази грешка:
2012 12:55:48 AM jButton5ActionPerformed
SEVERE: null
java.sql.SQLException: Before start of result set
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927)
at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:841)
at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5650)
at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5570)
Ние внимателно разглеждаме грешката и мислим. След това търсим в Google и намираме няколко примера и се опитваме да разберем решението.
GO TO FULL VERSION