bloque try catch y conexion JDBC

khanrogi
12 de Enero del 2005
Buenas a todos.
Tengo la siguiente duda de la utilizacion del try catch, a ver si me lo pueden aclarar:

Primero creo una conexion JDBC y luego hago un select.

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

Connection conn = DriverManager.getConnection("jdbc:odbc:khro","usuario","contraseña");

Statement sentencia = conn.createStatement();
try
{
ResultSet res = sentencia.executeQuery("select * from cuac");

}

... //codigo para tratar el select

conn.commit();

catch (SQLException e)
{
conn.rollback();

System.out.println("SQLCODE: " + e.getErrorCode());
System.out.println("SQLSTATE: " + e.getSQLState());
System.out.println("Error: " + e.getMessage());
}
catch (Exception ex)
{
conn.rollback();
System.out.println("Error: " + ex.getMessage());

}
finally
{
conn.close();
}

Esto es lo ke me dicta la logica. En caso de un error SQL o cualquier otro error, en el bloque catch hago un rollback (deshago la transaccion) y en el bloque finally hago un close, para cerrar la conexion, halla o no error.

Lo que kiero controlar es si hay un error en la conexion poniendo el try al principio de todo:
try
{
Connection conn = DriverManager.getConnection ("jdbc:odbc:khro","usuario","contraseña");

Statement sentencia = conn.createStatement();
} //blabla...

cuando hago esto, el compilador me dice que dentro de los bloques catch y finally no reconoce los simbolos conn, lo que me sugiere es que el ambito de dicho simbolo esta solamente del bloque try y por lo tanto, no se me ocurre como poder controlar un error en la conexion y, a la vez, en caso de un SQL error mas abajo hacer un rollback cuando sea necesario

Alguna idea?

Muchas gracias

Lucas
12 de Enero del 2005
Ambito de variables: Si defines una variable en un bloque, es visible unicamente en ese bloque, por lo que si defines la variable conn dentro de un try&catch, solo la podras utilizar en ese bloque.
Solucion:
Connection conn = null;
try {
Abrir conexion
} catch (...) { tratamiento error}

if (conn != null) {
try {
Ejecutamos query
} catch (..) {tratamiento error y rollback}
}

khanrogi
12 de Enero del 2005
Claro!!!!
No se me habia ocurrido algo tan basico como declarar el objeto antes de instanciarlo
Gracias!