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.
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
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