Colabora
 

Conexión a Informix con ADO.Net usando Stored Procedures en VB.Net 2005

 

"Trabajo,Ciencia y Verdad"

 

Fecha: 28/Jul/2008 (26-07-08)
Autor: Alfonso Castillo Coronado - cascor@live.com

 


CONTENIDO

  • 1.0- Introducción
  • 2.0- Software Requerido
  • 3.0- Configuración de Informix-Connect 3.0
  • 4.0- Agregar servicio y host en Windows
  • 5.0- Agregando Referencia IBM.Data.Informix en Proyecto
  • 6.0- Definición de la cadena de conexión Informix
  • 7.0- Guardar la cadena de conexión en un Archivo de Configuración
  • 8.0- Abrir y Cerrar Informix con Objeto de Conexión Ado.Net
  • 9.0- Cargar Datos y Crear Stored Procedure en Informix
  • 10.0- Ejecutar Stored Procedure y Visualizar Datos en un DataGridView
  • 11.0- Conclusiones

 

1.0-Introducción


En las aplicaciones Windows la conexión a la base de datos Informix es crítica y requiere de un alto nivel de seguridad. ADO.Net permite definir la conexión mediante la propiedad " connectionstring " del objeto de conexión. Definir y almacenar la cadena de conexión Informix, apropiadamente, es una tarea importante que tenemos como desarrolladores. En este artículo tú verás como iniciar y asegurar la cadena de conexión para aplicaciones Windows usando VB.Net 2005. También aprenderemos como llamar a un Procedimiento Almacenado con parametros de entrada desde VB.Net 2005 y finalmente veremos como mostrar la información devuelta por nuestro Procedimiento Almacenado en un DatagridView. Como un valor agregado a este artículo también encontrarás como configurar el Windows para que pueda trabajar con el Informix Dynamic Server.

Nota:
Este artículo esta orientado a desarrolladores Novatos(no tan novatos, se requieren tener los conocimientos básicos de programación, haber trabajado un poco con Ado.Net o por lo menos entender el concepto) y a los DBA en Informix que buscan desarrollar aplicaciones en .NET pero cuentan con muy poco tiempo para investigar.

2.0-Software Requerido


  • Informix Dynamic Server(IDS) 9 o superior
  • IBM Informix-Connect 3.0
  • Visual Basic 2005

Nota:
Tanto él Informix Dynamic Server(IDS) como IBM Informix-Connect 3.0 pueden ser descargados(trial version) gratuitamente de la página de IBM.(es necesario que primero te registres en él sitio (si lo sé es un gorro tener que hacer esto....pero lo piden, ¡Ánimooo!.).

3.0-Configuración de Informix-Connect 3.0


Antes de usar el proveedor nativo Informix para .Net deberás estar seguro que Informix-Connect 3.0 trabaja apropiadamente. Una vez instalado IBM Informix-Connect 3.0 es recomendable modificar la variable DBDATE=dmy4/, para lograr esto ve al menú Inicio>Todos los programas>IBM Informix Connect 3.0>SetNet32, claro que esto sólo aplica en caso de que desees trabajar las fechas en formato DIA/MES/AÑO por ejemplo (24/07/2008).

Nota:
Cuando distribuyas tú aplicación, es necesario que la máquina cliente tenga instalado Informix-Connect 3.0 y el Framework.NET 2.0.

4.0-Agregar servicio y host en Windows


Si el servidor IDS(Informix Dynamic Server) esta instalado en una máquina remota es necesario que especifiques el nombre del servicio y la dirección IP del servidor. Para establecer el servicio abre el archivo services (C:\WINDOWS\system32\drivers\etc) escribe el nombre del servicio,puerto y el protocolo, ejemplo: 

noreste_tcp 1526/tcp

La dirección IP se estable en el archivo host (C:\WINDOWS\system32\drivers\etc) teclea la IP del servidor y el nombre del host. Por ejemplo:  

192.179.188.65 noreste

IMPORTANTE: Si el IDS no reside en un servidor remoto, al instalar el IDS puedes tomar los valores que vienen por defecto(es decir, no es necesario que hagas lo anterior).

5.0-Agregando Referencia IBM.Data.Informix en Proyecto

Para que puedas hacer uso del proveedor nativo de Informix, antes es necesario que SUMES una referencia al Proyecto. En la ventana Solution Explorer, seleccionamos el nombre del proyecto(ese que te indica la ruta), damos clic derecho, seleccionamos Add Reference, pestaña Browse, buscamos el archivo IBM.Data.informix.dll para .Net 2.0 (recuerda la ruta donde instalaste IBM Informix-Connect 3.0) y seleccionamos OK.

6.0-Definición de la cadena de conexión Informix


La cadena de conexión es una propiedad del objeto de conexión ADO.Net IfxConnection. Esta es utilizado para conectarse con el servidor de Base de Datos Informix. La cadena de conexión contiene una serie de parámetros separados por puntos y comas(;). Estos parámetros tienen nombres especificos, definidos en el proveedor .NET tales como Dsn, Host, Server, Service, Protocol, Database, Uid, Pwd etc. Si un parámetro no es especificado en la cadena de conexión se asume su valor por defecto. El ejemplo 1 te muestra una cadena de conexión simple de Informix.

Dim IfxCadenaConexion As String
        ifxCadenaConexion = "Host=nombrehosts;" & _
        "Server=myServer;" & _
        "Service=ServiceName;" & _
        "Protocol=olsoctcp;Database=myDataBase;" & _
        "Uid=UserName;Pwd=myPassword;"

Ejemplo 1: Cadena de Conexión Informix

Después de que la cadena de conexión ha sido definida apropiadamente, esta puede ser usada por el objeto de conexión IfxConnection como un constructor o como una propiedad. Dentro del Ejemplo 2 la cadena de conexion IfxCadenaConexion es usada como un constructor. El método Open() del objeto de conexión establece una nueva conexión.

Dim ifxCadenaConexion As String
Dim IfxADOConexion As IfxConnection
        ifxCadenaConexion = "Host=HostName;" & _
        "Server=MyServerName;" & _
        "Service=MyServiceName;" & _
        "Protocol=olsoctcp;Database=MyDataBase;" & _
        "Uid=myUserName;Pwd=MyPassword;"

        IfxADOConexion = New IfxConnection(ifxCadenaConexion)
        IfxADOConexion.Open()

Ejemplo 2: Cadena de Conexión pasado como constructor al Objeto de Conexión ADO.Net

Dentro del Ejemplo 3 se indica como la cadena de conexión es usada como una propiedad del objeto de conexión IfxConnection.

Dim ifxCadenaConexion As String
Dim IfxADOConexion As IfxConnection
        ifxCadenaConexion = "Host=hostname;" & _
        "Server=myServerAddress;" & _
        "Service=service-name;" & _
        "Protocol=olsoctcp;Database=myDataBase;" & _
         "Uid=myUsername;Pwd=myPassword;"
        IfxADOConexion = New IfxConnection()
        IfxADOConexion.ConnectionString = ifxCadenaConexion
        IfxADOConexion.Open()

Ejemplo 3: Cadena de Conexión usada como propiedad del Objeto de Conexión ADO.Net

7.0-Guardar la cadena de conexión en un Archivo de Configuración


Una conveniente práctica de programación, es almacenar la cadena de conexión en un Archivo de Configuración. Esto permite un fácil mantenimiento de la aplicación en futuras actualizaciones, en caso de que que los párametros de la cadena de conexión requieran ser cambiados. Así que, como buenos desarrolladores que somos nunca colocamos la cadena de conexión embebida en nuestro código(Ver Ejemplo 1). Para comodidad de nosotros Visual Studio.Net 2005 hace sencilla la tarea de almacenar las configuraciones de nuestra aplicación dentro de un archivo de configuración(app.config). Para lograr esto, da un clic derecho en tu proyecto (ventana Solution Explorer) y selecciona Properties. Luego selecciona la pestaña Settings y teclea la información de abajo especificando los valores requeridos según corresponda(Figura 1).

Name Type Scope Value
IfxCadenaConexion (ConnectionString) Application Database=yyy;Uid=yyy; Pwd=yyy; Server=yyy;Service=yyy;

Figura 1: Configuraciones de nuestra Aplicación.

En las aplicaciones Windows, dentro del archivo de configuración App.Config existe la sección < ConnectionString > la cual almacena el valor de la cadena de conexión, como la mostrada en el ejemplo 4.

<connectionStrings>
        <add name="WindowsApplication1.My.MySettings.IfxCadenaConexion"
            connectionString="Server=yyy;Database=yyy;Uid=yyy; pwd=yyy; service=yyy" />
</connectionStrings>

Ejemplo 4: Sección ConnectionString del archivo App.Config.

En VB.Net 2005 el valor de la cadena de conexión puede ser rescatado usando el objeto " My " como se muestra en el ejemplo 5.

Dim mIfxCadenaConexion As String = My.Settings.IfxCadenaConexion

Ejemplo 5: Rescatando el valor de la cadena de conexión.

El beneficio de hacer uso del archivo app.config, es por la razón de que sí los parámetros de la cadena de conexión cambian, la actualización será sencilla. Compilar la aplicación nuevamente no será necesario. Detalles en el ejemplo 6.

Dim mifxCadenaConexion As String = My.Settings.IfxCadenaConexion
Dim IfxADOConexion As New IfxConnection
        IfxADOConexion.ConnectionString = mifxCadenaConexion
        IfxADOConexion.Open()

Ejemplo 6: Abrir conexión Informix de la cadena de conexión almacenada.

8.0-Abrir y Cerrar Informix con Objeto de Conexión Ado.Net


Para que podamos abrir nuestra conexión podemos hacer lo siguiente:  

1-Crear una instancia del objeto de conexión IfxConnection.  

2-Pasar la cadena de conexión como constructor ó bien especificar el valor de la propiedad ConnectionString.  

3-Usar el método Open().(Ver Ejemplo 7)

Para cerrar la conexión haremos uso de la función IsNothing()para chequear el estado de la conexión.(Ver Ejemplo 8). OJO Mágico " Es recomendable tomar en cuenta que una conexión a la base de datos debe ser abierta lo más tarde posible y cerrada lo antes posible. "

Private mIfxCadenaConexion As String = My.Settings.IfxCadenaConexion
Private mIfxConexion As IfxConnection

Private Function IfxADOAbrirConexion(ByRef str_MensajeError As String) As Boolean
        Try
            mIfxConexion = New IfxConnection
            mIfxConexion.ConnectionString = mIfxCadenaConexion
            mIfxConexion.Open()
            Return (True)
        Catch ex As Exception
            str_MensajeError = ex.Message
            Return (False)
        End Try
End Function

Ejemplo 7: Método para Abrir la Conexión a Informix.

Private Function IfxADOCerrarConexion(ByRef str_MensajeError As String) As Boolean
        Try
            If Not IsNothing(mIfxConexion) Then
                If mIfxConexion.State = ConnectionState.Open Then
                    mIfxConexion.Close()
                End If
                mIfxConexion = Nothing
            End If
            Return (True)
        Catch ex As IfxException
            str_MensajeError = ex.Message
            Return (False)
        End Try
 End Function

Ejemplo 8: Método para Cerrar la Conexión a Informix.

9.0-Cargar Datos y Crear Stored Procedure en Informix


Un Procedimiento Almacenado es un programa escrito en lenguaje del DBMS, los cuales son almacenados como parte de la Base de Datos. La experiencia nos ha enseñenado ha hacer uso de las herramientas que otros desarrolladores ya han invertido tiempo en construir, pero con la intención de favorecer a los escasos de tiempo (yo sé que los desarrollares somos muy jaladores pero lo que hace grande nuestro trabajo es debido a que trabajamos en equipo, así que hagamos uso de lo que ya esta funcionando; para que quemar neuronas si ya esta hecho, ¡Digoo No!), una de ellas son los SP los cuales tienen las siguientes ventajas:

a)Reuso de Código: Aplicaciones que usan la misma Base de Datos, pueden compartir los procedimientos almacenados, evitando el doble código  

b)Fácil Actualización: Si un procedimiento es cambiado, las modificaciones se reflejan automáticamente en la aplicación.

c)Respuesta: Debido a que los procedimientos son ejecutados en el servidor, esto reduce el tráfico en tú red.

Informix proporciona un programa llamado DBACCESS, el cual vamos a utilizar para crear nuestro procedimiento almacenado y una sencilla tabla. Para hacer esto dentro de la interfaz del DBACCESS vamos a la opción Query-Language y tecleamos el código mostrado en el Ejemplo 9 y 10.

Create table claves_proveedor(no_proveedor integer,clave nchar(10),
descripcion nchar(35), email nchar(40));

Insert into claves_proveedor(no_proveedor,clave,descripcion,email)
Values (1,’0003’,’novartis’,’pedro@novartis.com.mx’);
Insert into claves_proveedor(no_proveedor,clave,descripcion,email)
Values (1,’1415’,’ novartis’,’carlos@novartis.com.mx’);
Insert into claves_proveedor(no_proveedor,clave,descripcion,email)
Values (1,’2424’,’ novartis’,’tania@novartis.com.mx’);
Insert into claves_proveedor(no_proveedor,clave,descripcion,email)
Values (2,’6454’,’infomed’,’alonso@infomed.com.mx’);
Insert into claves_proveedor(no_proveedor,clave,descripcion,email)
Values (2,’3624’,’infomed’,’medina@infomed.com.mx’);
Insert into claves_proveedor(no_proveedor,clave,descripcion,email)
Values (2,’1456’,’infomed’,’paco@infomed.com.mx’);
Insert into claves_proveedor(no_proveedor,clave,descripcion,email)
Values (3,’2111’,’carmenMed’,’castro@carmenMed.com.mx’);
Insert into claves_proveedor(no_proveedor,clave,descripcion,email)
Values (4,’0345’,’fibrotests’,’olga@fibrotests.com.mx’);
Insert into claves_proveedor(no_proveedor,clave,descripcion,email)
Values (5,’5798’,’maypo’,’maria@maypo.com.mx’);
Insert into claves_proveedor(no_proveedor,clave,descripcion,email)
Values (6,’8974’,’infinity’,’rosy@infinity.com.mx’);
Insert into claves_proveedor(no_proveedor,clave,descripcion,email)
Values (7,’6531’,’camilamed’,’lulu@camilamed.com.mx’);
Insert into claves_proveedor(no_proveedor,clave,descripcion,email)
Values (8,’9862’,’femara’,’fernando@femara.com.mx’);
Insert into claves_proveedor(no_proveedor,clave,descripcion,email)
Values (9,’0002’,’farmacias’,’agosto@farmacias.com.mx’);
Insert into claves_proveedor(no_proveedor,clave,descripcion,email)
Values (10,’0078’,’pisa’,’regina@pisa.com.mx’);

Ejemplo 9: Definiendo la tabla claves_proveedor e insertando datos.

Create Procedure sp_Select_Proveedor(no_prov integer)Returning int, nchar(10),nchar(10),nchar40;
Define _no_proveedor int;
Define _clave nchar(10);
Define _descripcion nchar(10);
Define _email nchar(40);
Foreach
Select no_proveedor,  clave, Descripcion,   email
Into    _no_proveedor,_clave,_descripcion,_email
from claves_proveedor where no_proveedor=no_prov;
Return _no_proveedor,_clave,_descripcion,_email with resume;
End Foreach;
End Procedure;

Ejemplo 10: Procedimiento Almacenado para seleccionar los registros de la tabla claves_proveedor por el número de proveedor.

10.0-Ejecutar Stored Procedure y Visualizar Datos en un DataGridView

Para demostrar que todo lo que se dice arriba es verdad y funciona, se ha creado una solución sencilla con un formulario como el mostrado en la Figura 1. Este formulario carga la información según el número de proveedor.

 Formulario Conectar Informix con Stored Procedure

Figura 2: Formulario Conectar Informix con Stored Procedure.

El código del evento click del botón Buscar es mostrado en el Ejemplo 11. El código crea una nueva instancia de la clase InformixCadenaConexion y pasa la cadena de conexión mIfxCadenaConexion como un constructor. Finalmente retorna el mensaje de error(si lo hubiera) mediante el parametro str_MensajeError. Si un error ocurre un mensaje sera mostrado al usuario final. La instancia CadenaConexionObjeto llama al método DataGridViewLoadData (ejemplo 12). Este código utiliza el bloque Try..Catch block. En el bloque Try, el objeto de conexión ADO.net es abierto. Una nueva instancia del objecto ifxCommand es creada para asignar el procedimiento almacenado sp_Select_Proveedor a la propiedad CommandText. Después nosotros creamos una nueva instancia del objeto dataapdater IfxDataAdapter para almacenar la información devuelta por el procedimiento almacenado.

Private mIfxCadenaConexion As String = My.Settings.IfxCadenaConexion
Private str_MensajeError As String

Private Sub btnBuscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBuscar.Click
        Using CadenaConexionObjeto As New InformixCadenaConexion(mIfxCadenaConexion)
            Dim tabla As New DataTable
            tabla = CadenaConexionObjeto.DataGridViewLoadData(DataGridView1, str_MensajeError, CInt(TextBox1.Text))
            If Not IsNothing(str_MensajeError) Then
                MessageBox.Show(str_MensajeError, _
                Me.Text, _
                MessageBoxButtons.OK, _
                MessageBoxIcon.Information)
            End If
            DataGridView1.DataSource = tabla
        End Using
    End Sub

Ejemplo 11: Evento click del botón Buscar.

Public Function DataGridViewLoadData(ByVal DataGrid As DataGridView, ByRef str_MensajeError As String, ByVal parm_NoProveedor As Integer) As DataTable
            Dim tabla As New DataTable

            Try
                Using mifxConexion As New IfxConnection(mIfxCadenaConexion)
                    mifxConexion.Open()
                    Using mIfxComando As New IfxCommand
                        With mIfxComando
                            .Connection = mifxConexion
                            .CommandText = "sp_Select_Proveedor"
                            .CommandType = CommandType.StoredProcedure
                            .Parameters.Add(New IfxParameter("no_prov", IBM.Data.Informix.IfxType.Integer))
                            .Parameters("no_prov").Value = parm_NoProveedor
                        End With
                        Using mIfxAdaptador As New IfxDataAdapter
                            mIfxAdaptador.SelectCommand = mIfxComando
                            mIfxAdaptador.Fill(tabla)
                        End Using
                    End Using
                End Using
            Catch ex As IfxException
                str_MensajeError = ex.Message
            End Try
            Return Tabla
        End Function

Ejemplo 12: Método DataGridViewLoadData.

Finalmente nosotros obtendremos la información del proveedor, como vemos en la figura 3.

Form Conectar Informix SP resultados.

Figura 3: Formulario Conectar Informix con Stored Procedure(Resultados).

11.0-Conclusiones

Al establecer la conexión con Informix desde VB.Net 2005, requiere que tomes la precaución de almacenar la cadena de conexión en el archivo de configuración de la aplicación. No olvides que si estas trabajando con Bases de Datos, categóricamente te recomiendo que uses procedimientos almacenados. Los detalles de este articulo los encuentras en el código fuente, puedes descargarlo en el link que viene abajo. Espero que esta información te sea de gran utilidad. ¡¡¡Mucho éxito!!!. Atte: Cascor.

"Trabajo, Ciencia y Verdad".

Espacios de nombres usados en el código de este artículo:

IBM.Data.Informix

 



Compromiso del autor con el sitio del Guille:

Lo comentado en este artículo está probado (y funciona) con la siguiente configuración:

El autor se compromete personalmente de que lo expuesto en este artículo es cierto y lo ha comprobado usando la configuración indicada anteriormente.

En cualquier caso, el Guille no se responsabiliza del contenido de este artículo.

Si encuentras alguna errata o fallo en algún link (enlace), por favor comunícalo usando este link:

Gracias.


Código de ejemplo (comprimido):

 

Fichero con el código de ejemplo: Cascor_ConexionInformixVB.zip - 21.70 KB

(MD5 checksum: 63F1CE8AA5EE459C6B80C07521992A08)

 


Ir al índice principal de el Guille