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)
|
CONTENIDO
1.0-IntroducciónEn 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: 2.0-Software Requerido
Nota: 3.0-Configuración de Informix-Connect 3.0Antes 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: 4.0-Agregar servicio y host en WindowsSi 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 ProyectoPara 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 InformixLa 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ónUna 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).
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.NetPara 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 InformixUn 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’,’[email protected]’); Insert into claves_proveedor(no_proveedor,clave,descripcion,email) Values (1,’1415’,’ novartis’,’[email protected]’); Insert into claves_proveedor(no_proveedor,clave,descripcion,email) Values (1,’2424’,’ novartis’,’[email protected]’); Insert into claves_proveedor(no_proveedor,clave,descripcion,email) Values (2,’6454’,’infomed’,’[email protected]’); Insert into claves_proveedor(no_proveedor,clave,descripcion,email) Values (2,’3624’,’infomed’,’[email protected]’); Insert into claves_proveedor(no_proveedor,clave,descripcion,email) Values (2,’1456’,’infomed’,’[email protected]’); Insert into claves_proveedor(no_proveedor,clave,descripcion,email) Values (3,’2111’,’carmenMed’,’[email protected]’); Insert into claves_proveedor(no_proveedor,clave,descripcion,email) Values (4,’0345’,’fibrotests’,’[email protected]’); Insert into claves_proveedor(no_proveedor,clave,descripcion,email) Values (5,’5798’,’maypo’,’[email protected]’); Insert into claves_proveedor(no_proveedor,clave,descripcion,email) Values (6,’8974’,’infinity’,’[email protected]’); Insert into claves_proveedor(no_proveedor,clave,descripcion,email) Values (7,’6531’,’camilamed’,’[email protected]’); Insert into claves_proveedor(no_proveedor,clave,descripcion,email) Values (8,’9862’,’femara’,’[email protected]’); Insert into claves_proveedor(no_proveedor,clave,descripcion,email) Values (9,’0002’,’farmacias’,’[email protected]’); Insert into claves_proveedor(no_proveedor,clave,descripcion,email) Values (10,’0078’,’pisa’,’[email protected]’); 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 DataGridViewPara 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.
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. Figura 3: Formulario Conectar Informix con Stored Procedure(Resultados). 11.0-ConclusionesAl 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
|
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
|