lunes, 14 de julio de 2008

Procedimientos Almacenados en Access y Vb2005

Bien, sé que el título no es el mas adecuado para este artículo, porque como todos sabemos MS Access, no soporta los Procedimientos Almacenados como SQL Server, pero podemos hacer algunas "cositas parecidas", claro que bastante limitadas, como puede ser el caso de agregar, actualizar, eliminar y consultar registros en las tablas. Sé que muchos dirán que en estos tiempos podemos usar SQL Express, pero hay quienes aún prefieren usar MS Access y sus motivos deben tener.

Ahora, si estamos haciendo una aplicación en capas, pues verán que si lo hacemos como les mostraré, no encontrarán mucha diferencia ni demasiado trabajo al momento de pasarse a un motor como SQL Server, pues trataremos en lo posible que la codificación sea casi idéntica como si estuviéramos usando SQL Server, y de esta manera, al cambiar de motor, solamente cambiaríamos en nuestra capa de acceso a datos la cadena de conexión y un par de líneas mas y no soplarnos toda la codificación como normalmente sería usando access.

Bueno para no aburrirlos mas acá va un par de pantallazos de la "aplicación" de ejemplo, debo aclarles que no soy un experto en estas materia, así que espero encuentre de su agrado lo que voy a compartir con todos ustedes y espero sus críticas constructivas que siempre son bienvenidas y bueno, las destructivas también. jejejeje.

Clie1

Este el formulario bastante sencillo solamente para efectos de prueba de inserción y consultar datos por motivos de tiempo, la idea es ver los procedimientos y no el formulario.

El código del Botón Aceptar que es donde inserto los registros

Private Sub BtnAceptar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnAceptar.Click
       If MessageBox.Show("¿Seguro de Grabar los Datos ?", "Responda", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then
            Try
               

Dim Cone As New OleDb.OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Pruebas\Pruebas.mdb;Persist security info=false")

                Dim Comando As New OleDbCommand
               With Comando
                    Cone.Open()
                    .CommandText = "PA_Agrega_Clientes"
                    .CommandType = CommandType.StoredProcedure
                    .Connection = Cone
                    .Parameters.Add("@Codigo", OleDbType.Char, 10).Value = Me.TxtCodigo.Text
                    .Parameters.Add("@Nombre", OleDbType.VarChar, 50).Value = Me.TxtNombre.Text
                    .Parameters.Add("@Direccion", OleDbType.VarChar, 50).Value = Me.TxtDireccion.Text
               End With
                Dim Bien As Integer = Comando.ExecuteNonQuery
               If Bien = 0 Then
                    Throw New Exception("Falló la operacion de inserción")
               End If
                Comando.Dispose()
                Cone.Close()
                Cone.Dispose()
                MessageBox.Show("Datos Ingresados con éxito", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information)
            Catch ex As Exception
                MessageBox.Show(ex.Message, "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Error)
           End Try
       Else
            MessageBox.Show("Operacion cancelada por el usuario", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
       End If
    End Sub

Alli está el código bastante sencillo con eso estamos insertando los registros (3) de lo cual solo quería comentarles este par de lineas:

.CommandText = "PA_Agrega_Clientes"
.CommandType = CommandType.StoredProcedure

el "PA_Agrega_Cliente", como se podrán dar cuenta vendría a ser el nombre de nuestro procedimiento almacenado, y el CommandType=CommandType.StoreProcedure, lo estoy dejando como si realmente se tratara de un procedimiento almacenado y no como CommandText que es lo normal que hacemos en access, y después los parámetros lo pasamos tan igual que como si fuera en SQL Server.

Ahora en la Base de datos (Access) tengo estos 4 Procedimientos, que no son otra cosa que consultas de accion, de las cuales tambien les haré ver el código que contiene.

Clie2

Estos son mis "Procedimientos" con los cuales estoy trabajando, ahora el código no es nada extraño como verán en la siguiente imagen.

Clie3 

Eso es todo, solo falta el código de como devuelvo los datos al Datagridview (Botón buscar)

Private Sub BtnBuscar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnBuscar.Click
       Try
           Dim Cone As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Pruebas\Pruebas.mdb;Persist security info=false")
            Dim DBComando As New OleDbCommand
            Cone.Open()
            If Me.TxtCodigo.Text <> "" Then
                With DBComando
                    .CommandText = "PA_BuscarCliente_X_Codigo"
                    .CommandType = CommandType.StoredProcedure
                    .Parameters.Add("@Codigo", OleDbType.VarChar, 10).Value = Me.TxtCodigo.Text
                    .Connection = Cone
                End With
           ElseIf Me.TxtNombre.Text <> "" Then
                With DBComando
                    .CommandText = "PA_BuscarCliente_X_Nombre"
                    .CommandType = CommandType.StoredProcedure
                    .Parameters.Add("@Nombre", OleDbType.VarChar, 50).Value = Me.TxtNombre.Text
                    .Connection = Cone
               End With
           End If
           Dim Adaptador As New OleDbDataAdapter(DBComando)
            Dim oCliente As New Cliente.ClientesDataTable
            Adaptador.Fill(oCliente)
            Cone.Dispose()
            Me.DtgLista.DataSource = oCliente
        Catch ex As Exception
            Throw New Exception(ex.Message)
        End Try
     End Sub

Clie4

Ese es el resultado de ejecutar el botón buscar, si se fijan estoy usando un esquema (XSD) de la tabla clientes que usé para el ejemplo y con eso es súper fácil como dije al principio si están haciendo su aplicación en capas no tendrán casi nada de trabajo al cambiar a un motor como SQL Server.

Espero les sirva de algo y las disculpas del caso por si encuentran algo de malo, mi excusa será el tiempo, jajajajaja.

Saludos