miércoles, 21 de enero de 2009

Conector JAVA contra un ODBC

Necesitaba hacer una conexión entre una aplicación de escritorio PHP con PHP+GTK (cuando tenga un rato publicaré algo sobre este tema). Pero no era capaz de conectar PHP con un ODBC del sistema, ya que el paquete PHP+GTK que uso para ejecutar la aplicación no contenía la librería necesaria para hacer una conexión ODBC.

Así que opté por crearme un conector en JAVA. Solo necesitaba una aplciación "tonta" que devolviera dos columnas de una tabla de una base de datos SQL Server. Así que programé esta clase:
import java.sql.*;
public class Lanzadora {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
String DSN,Usuario,Clave,Opcion;
try{
DSN = args[0];
Usuario = args[1];
Clave = args[2];
Opcion = args[3];
}catch(Exception ex){
ayuda();
return;
}
Connection connection = DriverManager.getConnection("jdbc:odbc:"+DSN,Usuario,Clave);
if (connection != null) {
if(Opcion.compareTo("listado")==0)
listado(connection);
if(Opcion.compareTo("debug")==0)
infoConexion(connection);
}else
System.out.println("No fue posible establecer la conexión.");
}

public static void infoConexion(Connection connection) throws Exception {
System.out.println();
System.out.println("Successfully connected");
System.out.println();
// Meta data
DatabaseMetaData meta = connection.getMetaData();
System.out.println("Driver Information");
System.out.println("Driver Name: "+ meta.getDriverName());
System.out.println("Driver Version: "+ meta.getDriverVersion());
System.out.println("Database Information ");
System.out.println("Database Name: "+ meta.getDatabaseProductName());
System.out.println("Database Version: "+meta.getDatabaseProductVersion());
}

public static void listado(Connection connection)throws Exception{
// Get connection
Statement sentencia = connection.createStatement();
// listado de DNIs y CLAVES
String sql="SELECT campo1,campo2 FROM tabla WHERE campo3>0";
ResultSet result=sentencia.executeQuery(sql);
while(result.next())
System.out.println(result.getString(1)+";"+result.getString(2)+".");
}

public static void ayuda(){
System.out.println("Necesita definir algunos argumentos para que la aplicación funcione correctametne.");
System.out.println("1º nombre del DSN a utilizar");
System.out.println("2º nombre del usuario de la base de datos Epsilon");
System.out.println("3º contraseña del usuario");
System.out.println("4º opcion");
System.out.println(" listado (muestra el listado de DNIs y Claves)");
System.out.println(" debug (valida conexión)");

}
}

Como podéis ver solo necesito pasarle como parámetros el nombre del DSN, el usuario, la clave del usuario y la opción que quiero usar (listado o debug). Esto me devolverá en la salida estandar el listado como si fuera un fichero CSV.

Para ejecutar la clase y hacerla externa al entorno de desarrollo necesitaremos exportarla a fichero JAR. Yo particularmente uso como IDE Eclipse y en Eclipse para exportar un proyecto como JAR es muy sencillo, solo vas a "Archivo->Exportar...->Como fichero JAR" y sigues las instrucciones del asistente.

Una vez que tenemos el fichero .jar, solo tenemos que ejecutarlo con los parámetros correcto para obtener la relación de campo1 y campo2 de la base de datos.
java -jar fichero.jar < nombre del DSN > < usuario > < clave > < listado|debug >