Lágrimas e dor
Podem ocorrer erros durante a execução de um programa Java. Ao trabalhar com o banco de dados, ocorrerão erros . É tudo sobre qual deles você pode prever e oferecer uma solução adequada.
O primeiro grande grupo de erros estará esperando por você ao executar esta linha:
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "secret");
O que você pode esperar aqui?
Erro 1. Driver não encontrado .
Se você receber o erro “Nenhum driver adequado encontrado para…” , isso significa que o DriverManager não conseguiu entender que tipo de DBMS está por trás do seu URL. Por exemplo, você escreveu jdbc_mysql: em vez de jdbc:mysql:
Erro 2. Erro de conexão .
Se você cometer um erro no nome do host, provavelmente receberá uma mensagem como “Nenhum host é conhecido” ou “Falha no link de comunicação”.
Erro 3. O nome do banco de dados está incorreto .
Se você digitou incorretamente o nome do banco de dados ou se conectar a outro servidor onde ele não existe, receberá uma mensagem como “Banco de dados desconhecido 'supershop3'” .
Erro 4. Login ou senha incorreta .
Se você esqueceu a senha do banco de dados ou a digitou incorretamente, provavelmente receberá uma mensagem como “Acesso negado para o usuário 'root'@'localhost' (usando a senha: SIM)” .
Exceção SQL
Se a conexão com a base for estabelecida, será mais interessante ainda. Em caso de erros ao trabalhar com o banco de dados, o JDBC tem uma exceção especial - java.sql.SQLException . Bem como várias de suas variedades.
Essa exceção possui apenas um método adicional (em comparação com a classe Exception) - o método getSQLState(), que retorna o código de status (string) que o servidor SQL retornou a ele. O tratamento de erros se parece com isto:
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();
}
Existem centenas de códigos de erro. Você pode ver a lista completa aqui .
Mas, às vezes, os códigos de erro ajudam o JDBC a entender melhor o erro e, em seguida, lança não apenas SQLException, mas SQLException especializada:
BatchUpdateException | Erro durante solicitação de grupo |
DataTruncation | Frequentemente ocorre ao truncar dados longos |
SQLClientInfoException | O cliente passou parâmetros que não podem ser configurados na conexão: Conexão |
SQLDataException | Erro com dados, detalhes dependem do tipo de DBMS |
SQLException | Erro de acesso ao banco de dados ou outros erros gerais |
SQLFeatureNotSupportedException | DBMS não suporta esta funcionalidade |
SQLIntegrityConstraintViolationException | Todos os erros com para SQLState ==22 |
SQLInvalidAuthorizationSpecException | Erro de acesso e/ou autorização |
SQLNonTransientConnectionException | Todos os erros com para SQLState ==08 |
SQLRecoverableException | Há um erro, mas pode ser corrigido com a intervenção do aplicativo |
SQLSyntaxErrorException | Erro na sintaxe da consulta |
SQLTimeoutException | A solicitação demorou muito |
SQLTransactionRollbackException | Erro durante a reversão da transação |
SQLWarning | Aviso emitido pelo DBMS |
Exemplos de erros
Se ocorreu um erro no estágio do aplicativo do servidor, geralmente ele só pode ser registrado e tratado com mais detalhes. Mas se aconteceu enquanto o aplicativo estava sendo executado no computador do programador, você precisa investigar cuidadosamente o motivo disso.
Existem duas maiores classes de erros ao trabalhar com um banco de dados:
- Solicitar erro de texto
- Erro ao trabalhar com ResultSet
Um erro no texto da solicitação pode ocorrer com muita frequência. A consulta pode ser muito longa, conter várias tabelas (unidas via JOIN) e subconsultas (SUBSELECT). Não é fácil encontrar um erro em tal solicitação. Além disso, as solicitações geralmente são coladas a partir de peças, os dados são adicionados lá.
O primeiro erro que você deve estar ciente é SQLSyntaxErrorException . Esse erro geralmente significa que você tem um erro de digitação no corpo da solicitação.
Vamos pegar nosso exemplo favorito:
ResultSet results = statement.executeQuery("SELECT Count(*) FROM user");
results.next();
int count = results.getInt(1);
E “acidentalmente” exclua o asterisco no corpo da solicitação:
ResultSet results = statement.executeQuery("SELECT Count() FROM user");
results.next();
int count = results.getInt(1);
Então teremos uma exceção:
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)
O servidor SQL nos diz que houve um erro de sintaxe antes de FROM.
Nós olhamos cuidadosamente para o pedido e pensamos. Se nada vier à mente, e isso acontece com muita frequência, você precisa pedir a alguém para ver o que está errado.
Outro erro popular é o trabalho incorreto com ResultSet - o resultado da solicitação. Suponha que você esqueceu que antes de ler os dados, a “linha atual” do objeto ResultSet vem antes da primeira linha, então você terá o seguinte código:
ResultSet results = statement.executeQuery("SELECT Count(*) FROM user");
// results.next();
int count = results.getInt(1);
Você receberá este erro:
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)
Olhamos cuidadosamente para o erro e pensamos. Em seguida, pesquisamos no Google e encontramos alguns exemplos e tentamos entender a solução.