Lágrimas y dolor
Pueden ocurrir errores al ejecutar un programa Java. Al trabajar con la base de datos, se producirán errores. Se trata de cuál de ellos puede predecir y ofrecer una solución adecuada.
El primer gran grupo de errores te estará esperando al ejecutar esta línea:
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "secret");
¿Qué puedes esperar aquí?
Error 1. Controlador no encontrado .
Si obtiene el error "No se encontró un controlador adecuado para..." , significa que DriverManager no pudo entender qué tipo de DBMS está detrás de su URL. Por ejemplo, escribió jdbc_mysql: en lugar de jdbc:mysql:
Error 2. Error de conexión .
Si comete un error en el nombre del host, lo más probable es que reciba un mensaje como "No se conoce tal host" o "Error en el enlace de comunicaciones".
Error 3. El nombre de la base de datos es incorrecto .
Si escribió mal el nombre de la base de datos o se conecta a otro servidor donde no existe, recibirá un mensaje como "Base de datos desconocida 'supershop3'" .
Error 4. Nombre de usuario o contraseña incorrectos .
Si olvidó la contraseña de la base de datos o la ingresó incorrectamente, lo más probable es que reciba un mensaje como "Acceso denegado para el usuario 'root'@'localhost' (con contraseña: SÍ)" .
Excepción SQL
Sin embargo, si se establece la conexión con la base, será más interesante aún más. En caso de errores al trabajar con la base de datos, JDBC tiene una excepción especial: java.sql.SQLException . Así como varias de sus variedades.
Esta excepción tiene solo un método adicional (en comparación con la clase Exception): el método getSQLState(), que devuelve el código de estado (cadena) que le devolvió el servidor SQL. El manejo de errores se ve así:
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();
}
Hay cientos de códigos de error. Puedes ver la lista completa aquí .
Pero a veces los códigos de error ayudan a JDBC a comprender mejor el error y luego lanza no solo una SQLException, sino una SQLException especializada:
BatchUpdateException | Error durante la solicitud de grupo |
Truncamiento de datos | Suele ocurrir cuando se truncan datos largos |
SQLClientInfoException | El cliente pasó parámetros que no se pueden configurar en la conexión: Conexión |
SQLDataException | Error con los datos, los detalles dependen del tipo de DBMS |
SQLException | Error de acceso a la base de datos u otros errores generales |
SQLFeatureNotSupportedException | DBMS no admite esta funcionalidad |
SQLIntegrityConstraintViolationException | Todos los errores con para SQLState == 22 |
SQLInvalidAuthorizationSpecException | Error de acceso y/o autorización |
SQLNonTransientConnectionException | Todos los errores con para SQLState ==08 |
SQLRecoverableException | Hay un error, pero se puede arreglar con la intervención de la aplicación. |
SQLSyntaxErrorException | Error en la sintaxis de la consulta |
SQLTimeoutException | La solicitud tardó demasiado |
SQLTransactionRollbackException | Error durante la reversión de la transacción |
SQLAdvertencia | Advertencia emitida por el DBMS |
Ejemplos de errores
Si se produjo un error en la etapa de la aplicación del servidor, generalmente solo se puede registrar y luego tratar con más detalle. Pero si sucedió mientras la aplicación se ejecutaba en la computadora del programador, entonces debe investigar cuidadosamente la razón de esto.
Hay dos grandes clases de errores cuando se trabaja con una base de datos:
- Solicitar error de texto
- Error al trabajar con ResultSet
Un error en el texto de la solicitud puede ocurrir muy a menudo. La consulta puede ser muy larga, contener varias tablas (unidas a través de JOIN) y subconsultas (SUBSELECT). No es fácil encontrar un error en tal solicitud. Además, las solicitudes a menudo se unen a partir de partes, se agregan datos allí.
El primer error que debe tener en cuenta es SQLSyntaxErrorException . Tal error generalmente significa que tiene un error tipográfico en el cuerpo de la solicitud.
Tomemos nuestro ejemplo favorito:
ResultSet results = statement.executeQuery("SELECT Count(*) FROM user");
results.next();
int count = results.getInt(1);
Y "accidentalmente" borre el asterisco en el cuerpo de la solicitud:
ResultSet results = statement.executeQuery("SELECT Count() FROM user");
results.next();
int count = results.getInt(1);
Entonces obtendremos una excepción:
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)
El servidor SQL nos dice que hubo un error de sintaxis antes de FROM.
Miramos cuidadosamente la solicitud y pensamos. Si no se le ocurre nada, y esto sucede con mucha frecuencia, entonces debe pedirle a alguien que mire qué está mal.
Otro error popular es el trabajo incorrecto con ResultSet , el resultado de la solicitud. Suponga que olvidó que antes de leer los datos, la "fila actual" del objeto ResultSet viene antes de la primera fila, entonces tendrá el siguiente código:
ResultSet results = statement.executeQuery("SELECT Count(*) FROM user");
// results.next();
int count = results.getInt(1);
Obtendrá este error:
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)
Miramos cuidadosamente el error y pensamos. Luego buscamos en Google y encontramos un par de ejemplos e intentamos entender la solución.