Conexión con mysql desde iSeries

1
9003

Conexión con mysql desde iSeries.

0. Índice de contenidos.

1. Introducción

En primer lugar quiero agradecer el espacio que me brinda

Autentia para

divulgar este tutorial, es el primero y espero que no sea el último. En segundo lugar agradecer a Scott Klement por

su sabiduría y su generosidad al transmitirla.

Este tutorial va intentar explicar como nos podemos conectar a

cualquier base de datos desde un as/400 o iseries gracias a la

posibilidad de llamar a métodos java desde RPG, consiguiendo eliminar

las limitaciones de conexión de un iSeries. 

La

base de datos que vamos a utilizar para ilustrarnos va a ser MYSQL

pero en los ficheros que os podéis bajar en el enlace que os detallo

más abajo, vienen ejemplos para cualquier base de datos conocida.

2. Entorno

El tutorial está escrito usando el siguiente entorno:

  • Hardware: Portátil HP EliteBook 2560p i5-2540M
  • Sistema operativo: Windows 7 Enterprise.
  • JDK 1.7.0_15

3. Instalación

Instalación en nuestro iSeries:

1.- Lo primero que debemos hacer es bajarnos el driver de

conexión con

la base de datos que corresponda, en nuestro caso lo vamos a hacer con

mysql, por lo tanto nos bajamos el driver: http://www.mysql.com/downloads/connector/j/

2.- Subimos el fichero jar del driver al

IFS(carpeta)  a nuestro iSeries:

  • Instalación del jdbc en IFS:
  • Creamos

    el directorio en el iseries: CRTDIR DIR(‘/java’) DTAAUT(*RX)

    OBJAUT(*NONE).

  • Creamos

    la carpeta donde vamos a alojar el fichero jar: CRTDIR

    DIR(‘/java/jdbc’) DTAAUT(*RX) OBJAUT(*NONE).

  • Copiamos el fichero jar en

    el directorio que hemos creado.

3.- Una vez copiado el fichero jar en nuestra carpeta iSeries, ya

podemos hacer uso de él, por lo que añadimos el fichero JAR a nuestro CLASSPATH

del iSeries

para poder

ejecutar nuestros programas. 

  • ADDENVVAR

    ENVVAR(CLASSPATH)

    VALUE(‘/java/jdbc/mysql-connector-java-X.X.X-bin.jar’)

  • 4.- Vamos a subir los programas necesarios para conectarnos a la

    base de datos. Aquí es donde realmente se ve el trabajo realizado

    por Scott Klement, ya que se ha creado los prototype

    necesarios para poder ejecutar todos los métodos que necesitamos para

    conectarnos a la base de datos que queramos. 

    Os dejo algún fragmento

    del código (añadirlo todo sería muy largo), donde podemos ver como se crean y como llamamos a métodos java desde RPG.

    JDBC_H.RPGLE

    D Statement s O CLASS(*JAVA:
    D 'java.sql.Statement')
    D Connection s O CLASS(*JAVA:
    D 'java.sql.Connection')
    D ResultSet s O CLASS(*JAVA:
    D 'java.sql.ResultSet')
    D ResultSetMetaData...
    D s O CLASS(*JAVA:
    D 'java.sql.ResultSetMetaData')
    D PreparedStatement...
    D s O CLASS(*JAVA:
    D 'java.sql.PreparedStatement')
    D CallableStatement...
    D s O CLASS(*JAVA:
    D 'java.sql.CallableStatement')
    D Properties s O CLASS(*JAVA:
    D 'java.util.Properties')
    
    *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    * JDBC_Connect(): Crea una conexión usando JDBC driver
    *
    * driver = (input) Nombre del JDBC driver a usar
    * url = (input) JDBC URL de la base de datos a conectar
    * userid = (input) userid
    * password = (input) password
    *
    * Retorna una conexión o *NULL si falla
    *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    D JDBC_Connect PR like(Connection)
    D driver 256A varying const options(*varsize)
    D url 256A varying const options(*varsize)
    D userid 50A varying const options(*varsize)
    D password 50A varying const options(*varsize)
    

    JDBCR4.RPGLE

    *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    * JDBC_ConnProp(): Conecta a la base de datos w/properties object
    *
    * driver = (input) Nombre del JDBC driver a usar
    * url = (input) JDBC URL de la base de datos a conectar
    * prop = (input) properties a usar cuando conecta
    *
    * Retorna una conexión o *NULL si falla
    *+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
    P JDBC_ConnProp B export
    D JDBC_ConnProp PI like(Connection)
    D drivname 256A varying const options(*varsize)
    D url 256A varying const options(*varsize)
    D prop like(Properties)
    D drv s like(Driver)
    D temp s like(Connection)
    D conn s like(Connection)
    	/free
    	jdbc_begin_object_group(50);
    	monitor;
    	// Encontrando e instanciando el driver
    	drv = new_Driver(drivname);
    	if (drv = *NULL);
    	jdbc_end_object_group();
    	return *NULL;
    	endif;
    	// Registrando con DriverManager
    	// y conectando.
    	registerDriver(drv);
    	temp = Driver_ConnProp( drv : url: prop );
    	if (temp = *NULL);
    	jdbc_end_object_group();
    	return *NULL;
    	endif;
    	jdbc_end_object_group(temp: conn);
    	return conn;
    	on-error;
    	jdbc_end_object_group();
    	return *NULL;
    	endmon;
    	/end-free
    P E
    

    Podéis bajaros los fuentes y ficheros necesarios donde se incluye

    un README que explica perfectamente como se realiza la subida de

    los ficheros y su instalación.

    http://www.iprodeveloper.com/Content/Content/63737/RpgAndJdbc.zip

    5.- Una vez subidos los programas al iSeries:

    • Creamos el módulo RPG

      (CRTRPGMOD)

    • CRTRPGMOD JDBCR4

      SRCFILE(QRPGLESRC) DBGVIEW(*LIST)

    • Creamos el programa de

      servicios (CRTSRVPGM) 

    • CRTSRVPGM

      SRVPGM(JDBCR4) EXPORT(*SRCFILE) SRCFILE(QSRVSRC)

    •  Creamos

      el directorio de enlace (CRTBNDDIR) 

    • CRTBNDDIR

      BNDDIR(mylib/JDBC)

    • Añadimos la entrada

      directorio enlace (ADDBNDDIRE)

    • ADDBNDDIRE

      BNDDIR(mylib/JDBC) OBJ((JDBCR4 *SRVPGM))

    4. Ejemplos.

    Os voy a mostrar dos ejemplos que están realizados en Rpg

    Free y cuya explicación de las líneas importantes, las he puesto en

    el propio código para que sea más fácil entender lo que vamos

    realizando:

    1.- Muestra una conexión con mysql a través del iSeries.

     h Dftactgrp(*NO) Bnddir('JDBC')
     **********************************************************************
     * Función : Conexión mysql directos tabla clientes
     *
     * Autor: Berto Gil Hernández
     **********************************************************************
     *
    ff_Alclac uf a e k Disk usropn
     *
    /copy jdbc_h
     *
    d CMYSQLCLI PR Extpgm('CMYSQLCLI')
    d userid 15A Const
    d passwrd 15A Const
    d CMYSQLCLI PI
    d userid 15A Const
    d passwrd 15A Const
     *
    d CreateDb PR 1N
    d CreateTable PR 1N
     *
    d conn s Like(Connection)
    d ErrMsg s 50A
    d wait s 1A
    d count s 10I 0
    d rs s Like(ResultSet)
     *
    	/free
    	*Inlr = *On;
    	// Abrimos fichero donde se van a guardar los datos
    	Open f_Alclac;
    	// Creamos conexión con el servidor
    	conn = MySql_Connect( 'localhost'
    	: 'directos'
    	: %trim(userid)
    	: %trim(passwrd) );
    	// Creamos sentencia sql
    	rs = jdbc_ExecQry( conn : 'Select *'
    	+ ' from Client' );
    	// Recorremos ResultSet 
    	Dow (jdbc_nextRow(rs));
    	Alclcl = %int(jdbc_getCol(rs: 1));
    	Alclde = jdbc_getCol(rs: 2);
    	Alclac = %int(jdbc_getCol(rs: 3));
    	// Grabamos en el fichero los resultados de la consulta
    	Write r_Alclac;
    	EndDo;
    	jdbc_freeResult(rs);
    	// Cerramos conexión
    	jdbc_close(conn);
    	Return;
    	// Cerramos fichero donde se van guardar los datos
    	Close f_Alclac;
    /end-free 
    

    5. Referencias

    6. Conclusiones.

    Gracias a este método de conexión, conseguimos eliminar la

    barrera que suponía el acceder desde un iseries a otra base de datos de

    otro fabricante. Con ello hemos conseguido ampliar nuestro abanico de

    posibilidades para nuestras aplicaciones en iseries.

    Un saludo.

    Berto Gil

    mailto:berto.gil@gmail.com

    1 COMENTARIO

    1. Gracias Berto, yo ya tenía trabajando una conexión con un servidor MSSQL basado en el Trabajo de Scott K. pero ahora que estaba intentando conectar con un server MySQL no funcionaba.

      En teoria Scott hizo el subprocedimiento JDBC_Connect() como conector para todas la BD basadas en JDBC pero no me funcionó.

      Mirando tu ejemplo observe que en tu segundo ejemplo en lugar de utilizar el subprocedimiento JDBC_Connect() usaste MySql_Connect() así que lo use y !Listo¡ funcionó a la perfección

    DEJA UNA RESPUESTA

    Por favor ingrese su comentario!

    He leído y acepto la política de privacidad

    Por favor ingrese su nombre aquí

    Información básica acerca de la protección de datos

    • Responsable:
    • Finalidad:
    • Legitimación:
    • Destinatarios:
    • Derechos:
    • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad